Python:同步trio任务和普通线程的方法

2024-09-30 02:29:44 发布

您现在位置:Python中文网/ 问答频道 /正文

我发现自己的情况是需要将Trio任务与Python线程同步。目前,我使用的是threading.Lock对象,三个任务必须用trio.run_sync_in_worker_thread(lock.acquire)获取这些对象。在

我认为还可以使用trio. Lock锁,并让线程用trio.BlockingTrioPortal.run_sync(lock.acquire)获取它们。在

这些解决方案中的任何一个都比另一个有优势吗?在

原则上可以做得更好吗?E、 {1>为什么需要一个独立的线程来实现一个独立的工作线程?在


Tags: 对象runinlocktrio情况sync线程
2条回答

两种方法都很好。我建议使用减少工作量的方法,也就是说,如果外部线程在每个Trio任务中获得锁10次,那么使用线程锁,反之亦然。在

threading.Lock总是阻止试图获取它的线程,因此从Trio获取它要么需要一个单独的线程(不管怎样,第一个方法已经这样做了),要么锁的持有者需要向Trio任务发出它已经释放锁的信号(您的第二个方法无论如何都会这样做),因此实现较低级别没有明显的优势解决方案。在

马蒂亚斯的回答很好。补充:使用trio.Lock有一个理论上的优势,那就是至少三个端调用将支持取消。然而,目前还有一个主要的实际障碍,那就是目前使用BlockingTrioPortal来调用lock.acquire和{}并不起作用:-(。有关详细信息,请参见this issue I just filed。所以在修复之前,您必须使用threading.Lock和{}。不过,在修复之后,我将默认使用trio.Lock作为取消操作。在

编辑:经过进一步思考,我记得trio已经有了一个与BlockingTrioPortal一起工作的Lock版本,只是不太清楚:trio.Semaphore(1, max_value=1)。我们仍然应该解决一般情况,但同时这可能是一个有用的事情知道。在

相关问题 更多 >

    热门问题