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)