|
|
1
3
对于初学者来说,不鼓励将asyncio和线程混合使用,因为这会导致不必要的复杂性,并且通常是由于缺乏对如何正确使用asyncio的理解。不熟悉asyncio的程序员通常习惯于使用线程,将其用于更适合协同路由的任务。
但是,如果您有充分的理由生成一个运行asyncio事件循环的线程,那么一定要这样做——没有什么需要在主线程中运行asyncio事件循环的。只需小心与事件循环本身交互(调用方法,如
请注意,设置全局变量等不算“交互”,因为asyncio不观察这些变量。当然,由您来处理线程间同步问题,例如使用锁保护对复杂可变结构的访问。
如果不确定是否混合线程和异步IO,可以问自己两个问题:
您的问题很好地回答了这两个问题—您需要线程以便主线程可以与jupyter交互,您需要asyncio,因为您依赖于使用它的库。
GIL确保在一个线程中设置全局变量并在另一个线程中读取它是没有数据争用的,因此您所显示的内容应该很好。
如果添加显式同步,例如多线程队列或条件变量,则应记住同步代码不得阻止事件循环。换句话说,你不能只是等待,比如说
|
|
|
Kristy · 无法通过conda安装Asyncio 8 年前 |