Skip to content
This repository was archived by the owner on Nov 23, 2017. It is now read-only.
This repository was archived by the owner on Nov 23, 2017. It is now read-only.

Round timeout in BaseEventLoop._run_once() #106

@GoogleCodeExporter

Description

@GoogleCodeExporter
Hi, I tried to compare Tulip and Trollius, to try to understand how "yield 
from" is different from "yield". I wrote the following script:
https://bitbucket.org/haypo/asyncio_staging/src/47a0b9c/event_loop_run_once.py

When I replaced asyncio.sleep(1.0) with asyncio.sleep(0.1), I saw more than 50 
calls to _run_once() wheras only 4 calls are required with a sleep of one 
second.

Example with a sleep of 100 milliseconds:
- Tulip computes a deadline of 99.98 milliseconds, epoll_wait() is called with 
a timeout of 99 ms
- Timeout, but the scheduled task is not scheduled because there is still a 
difference of 0.6 milliseconds
- Tulip computes a deadline of 0.47 ms, epoll_wait() is called with a timeout 
of... 0 ms
- Timeout, but the scheduled task is not scheduled because there is still a 
difference of... 0.3 milliseconds
- etc. until the timeout is reached

The number of iterations depends on the speed of your CPU. For example, a dummy 
loop calling sleep(1e-3) ten times calls _run_once() 918 times on my laptop...

The problem is that the C function epoll_wait() expects a C int for the 
timeout, which is a number of milliseconds. So 99.98 ms should be rounded to 
*100* ms, and 0.47 ms must be rounded to 1 ms.

In my opinion, it's a bug in CPython: epoll.poll(timeout) should wait *at 
least* timeout seconds, but not *less*.

I reported the issue in CPython:
http://bugs.python.org/issue20311

Even if the bug in fixed in Python 3.4 and the next release of Python 3.3, 
Tulip should works around this bug to support older Python 3.3 released.

Attached patch should fix the issue.

Original issue reported on code.google.com by victor.s...@gmail.com on 20 Jan 2014 at 10:52

Attachments:

Metadata

Metadata

Assignees

No one assigned

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions