[英]Python: ways to synchronize trio tasks and regular threads
我发现自己需要将Trio任务与Python线程同步。 目前,我使用的是Trio任务必须通过trio.run_sync_in_worker_thread(lock.acquire)
获取的threading.Lock
对象。
我认为也可以使用trio. Lock
trio. Lock
锁并使线程使用trio.BlockingTrioPortal.run_sync(lock.acquire)
获取它们。
这些解决方案中的任何一个都比其他解决方案具有优势吗?
原则上可以做得更好吗? 例如,实现一个等待threading.Lock
的“本机”三重方法。 threading.Lock
而无需单独的工作线程,或者是否有根本原因要求这样做?
两种方法都很好。 我建议使用减少工作量的方法,即,如果外部线程在每个Trio任务一次获得十次锁,则使用线程锁,反之亦然。
一个threading.Lock
始终会阻止试图获取该线程的线程,因此从Trio中获取该线程要么需要一个单独的线程(您的第一个方法已经执行了此操作),要么锁的持有人需要向Trio任务发出信号,表明它已释放了该锁( (无论如何,您的第二种方法都可以做到),因此实现较低级别的解决方案没有明显的优势。
Matthias的回答很好。 补充说明:使用trio.Lock
有一个理论上的优势,那就是至少Trio端调用将支持取消。 但是,当前还存在一个主要的实际障碍,那就是当前使用BlockingTrioPortal
调用lock.acquire
和lock.release
不起作用:-(。请参阅我刚才提交的问题以获取详细信息。因此,在解决此问题之前,您已经'将不得不使用threading.Lock
和run_sync_in_worker_thread
。但是,在修复之后,我将默认使用trio.Lock
作为取消对象。
编辑:经过进一步的思考,我记得三人组已经具有可与BlockingTrioPortal
一起使用的Lock
版本,只是晦涩: trio.Semaphore(1, max_value=1)
。 我们仍然应该解决一般情况,但是与此同时,这可能是一件有用的事情。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.