1

我发现自己需要将 Trio 任务与 Python 线程同步。目前,我正在使用threading.LockTrio 任务必须使用trio.run_sync_in_worker_thread(lock.acquire).

我认为也应该可以使用trio. Lock锁并让线程使用trio.BlockingTrioPortal.run_sync(lock.acquire).

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

原则上会比这做得更好吗?例如,实现一个“本机”三重奏方法,无需单独的工作线程就可以等待threading.Lock,或者是否有根本原因需要这样做?

4

2 回答 2

1

两种方法都很好。我建议使用减少工作量的方法,即如果外部线程在每个 Trio 任务的一次中获得十次锁,则使用线程锁,反之亦然。

Athreading.Lock总是阻塞试图获取它的线程,因此从 Trio 获取它要么需要一个单独的线程(无论如何你的第一个方法已经这样做了),或者锁的持有者需要通知 Trio 任务它已经释放了锁(你的第二个方法无论如何),因此实施较低级别的解决方案没有明显的优势。

于 2018-09-23T19:02:53.643 回答
1

马蒂亚斯的回答非常好。补充一点:使用 a 有一个理论上的优势trio.Lock,那就是至少 Trio-side 调用将支持取消。但是,目前还有一个主要的实际障碍,那就是目前,使用BlockingTrioPortal来调用lock.acquire并且lock.release不起作用:-(。有关详细信息,请参阅我刚刚提交的这个问题。所以在修复之前,您必须使用threading.Lockand run_sync_in_worker_thread。不过,在它修复之后,我会默认使用trio.Lock取消的东西。

编辑:进一步思考,我记得三重奏确实已经有一个版本Lock可以与. 我们仍然应该解决一般情况,但与此同时,这可能是一件有用的事情。BlockingTrioPortaltrio.Semaphore(1, max_value=1)

于 2018-09-24T09:32:09.203 回答