在线程中嵌入运行 asyncio 事件循环
我有一个使用Qt的应用程序,它通过pybind嵌入了Python插件,这些插件提供了一些处理功能。根据我在网上看到的,连接事件循环几乎是不可能的。现在我想知道是否可以在C++的后台线程中运行一个asyncio事件循环,并在其他线程(比如主线程或其他线程)中调用gather(聚合)。在C++中调用的脚本是线程安全的,而全局解释器锁(GIL)又把它们串行化了。
我觉得问题可以归结为以下几点:如果C++线程运行一个asyncio事件循环,它会持有GIL吗?还是在空闲时会释放它?
如果它持有GIL,我就会陷入死锁。
如果它释放了GIL,理论上C++线程可以进入Python的环境并调用gather,这样就很好了。
不过,这又引出了一个问题:gather是否会锁住GIL?如果会的话,那就没什么意义了,因为其他C++线程就无法进入Python的环境,这样就和我根本没有使用asyncio是一样的。
1 个回答
0
在Python应用中,把两个事件循环连接在一起是比较困难的(但可以做到),不过你现在是在用C++开发应用,所以你可以在不同的线程中创建任意数量的事件循环,完全没有问题。
你可以在另一个线程中启动Python解释器,并在那里运行任何同步或异步的代码。虽然全局解释器锁(GIL)会让Python解释器的线程暂停,但主线程(也就是图形界面线程)不会受到影响。