我发现自己的情况是需要将Trio任务与Python线程同步。目前,我使用的是threading.Lock
对象,三个任务必须用trio.run_sync_in_worker_thread(lock.acquire)
获取这些对象。在
我认为还可以使用trio. Lock
锁,并让线程用trio.BlockingTrioPortal.run_sync(lock.acquire)
获取它们。在
这些解决方案中的任何一个都比另一个有优势吗?在
原则上可以做得更好吗?E、 {1>为什么需要一个独立的线程来实现一个独立的工作线程?在
Tags:
两种方法都很好。我建议使用减少工作量的方法,也就是说,如果外部线程在每个Trio任务中获得锁10次,那么使用线程锁,反之亦然。在
threading.Lock
总是阻止试图获取它的线程,因此从Trio获取它要么需要一个单独的线程(不管怎样,第一个方法已经这样做了),要么锁的持有者需要向Trio任务发出它已经释放锁的信号(您的第二个方法无论如何都会这样做),因此实现较低级别没有明显的优势解决方案。在马蒂亚斯的回答很好。补充:使用}并不起作用:-(。有关详细信息,请参见this issue I just filed。所以在修复之前,您必须使用}。不过,在修复之后,我将默认使用
trio.Lock
有一个理论上的优势,那就是至少三个端调用将支持取消。然而,目前还有一个主要的实际障碍,那就是目前使用BlockingTrioPortal
来调用lock.acquire
和{threading.Lock
和{trio.Lock
作为取消操作。在编辑:经过进一步思考,我记得trio已经有了一个与
BlockingTrioPortal
一起工作的Lock
版本,只是不太清楚:trio.Semaphore(1, max_value=1)
。我们仍然应该解决一般情况,但同时这可能是一个有用的事情知道。在相关问题 更多 >
编程相关推荐