python - asyncio.TimeoutError 永远不会引发

标签 python python-3.4 python-asyncio

我想测试 asyncio 如何处理阻塞进程。

我的代码一定有问题,因为 asyncio.TimeoutError 从未引发:

import asyncio, random, time

q = asyncio.Queue()

MAX_WAIT = 5

@asyncio.coroutine
def blocking_task(sec):
    print('This task will sleep {} sec.'.format(sec))
    time.sleep(sec)

@asyncio.coroutine
def produce():
    while True:
        q.put_nowait(random.randint(1,10))
        yield from asyncio.sleep(0.5 + random.random())

@asyncio.coroutine
def consume():
    while True:
        value = yield from q.get()
        try:
            yield from asyncio.wait_for(blocking_task(value), MAX_WAIT)
        except asyncio.TimeoutError:
            print('~/~ Job has been canceled !!')
        else:
            print('=/= Job has been done :]')


loop = asyncio.get_event_loop()
asyncio.ensure_future(produce())
asyncio.ensure_future(consume())
loop.run_forever()

此代码产生以下输出:

$ ./tst3.py 
This task will sleep 2 sec.
=/= Job has been done :]
This task will sleep 1 sec.
=/= Job has been done :]
This task will sleep 7 sec.
=/= Job has been done :]

最佳答案

Use asyncio.sleep instead of sleep

TimeoutError of asynciobuildin TimeoutError 不同。这就是为什么您不能使用 time.sleep 来触发此错误。要在asyncio.coroutine中触发TimeoutError,只能使用asyncio模块实现的定时器。

@asyncio.coroutine
def blocking_task(sec):
    print('This task will sleep {} sec.'.format(sec))
    yield from asyncio.sleep(sec)

结果

This task will sleep 10 sec.
~/~ Job has been canceled !!
This task will sleep 3 sec.
=/= Job has been done :]
This task will sleep 4 sec.
=/= Job has been done :]
This task will sleep 2 sec.
=/= Job has been done :]
This task will sleep 7 sec.
~/~ Job has been canceled !!
This task will sleep 2 sec.
=/= Job has been done :]

关于python - asyncio.TimeoutError 永远不会引发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40265882/

相关文章:

python - 如何使用 scikit-learn 预测具有分类和连续特征的二元结果?

python - Pyaudio - 将声音数据转换为字符串的算法

python 的 asyncio 在 2 个协程之间交换数据 - 其中一个执行同步和 CPU 密集型代码

python - 使用异步事件循环运行 tornado.testing.AsyncTestCase

python - 在 python asyncio 中使用协程创建多个生产者和消费者的规范方法是什么?

python - 将特定于组的功能添加到 pandas 数据框

python - 将 Conda 更新到 4.6.1 以集成 PowerShell 后,Conda 无法安装 Conda-forge 软件包

Python:运行时根据requirements.txt设置PYTHONPATH

python - Tar --exclude 在 popen(shell=False) 时不起作用

python - 读取/写入大型二进制文件时的首选 block 大小