Python协程开发小结

如何设置超时时间#

协程里面不少函数是没有超时时间设置的,一些核心场景要避免一直等待,则需要设置超时时间。

可以通过 asyncio.wait_for() 函数来实现有超时时间的等待。例如:

process = await asyncio.create_subprocess_exec(
    'find', ['.', '-iname', '*.py'],
    stdout=asyncio.subprocess.PIPE)

line = await asyncio.wait_for(process.stdout.readline(), 5)

第二行代码在读取进程的stdout时,通过 asyncio.wait_for() 函数设置5秒的超时时间。

如何与线程通信#

当协程要与线程进行通信时,假设需要通过一个Queue来实现通信,协程的 asyncio.Queue() 文档明确说明了是线程不安全的,所以不适合在线程中使用。

queue.Queue() 是线程安全的,但其方法是阻塞的,如果在协程中直接调用可能会导致 所有 协程都阻塞住。

正确的姿势是使用线程安全的 queue.Queue() ,但是在协程里面通过 run_in_executor() 函数调用其方法:

item = await asyncio.get_event_loop().run_in_executor(executor, q.get)
comments powered by Disqus