繁体   English   中英

Python:同步三重任务和常规线程的方法

[英]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.acquirelock.release不起作用:-(。请参阅我刚才提交的问题以获取详细信息。因此,在解决此问题之前,您已经'将不得不使用threading.Lockrun_sync_in_worker_thread 。但是,在修复之后,我将默认使用trio.Lock作为取消对象。

编辑:经过进一步的思考,我记得三人组已经具有可与BlockingTrioPortal一起使用的Lock版本,只是晦涩: trio.Semaphore(1, max_value=1) 我们仍然应该解决一般情况,但是与此同时,这可能是一件有用的事情。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM