我已经阅读了许多关于python线程和各种方法来讨论'跨越线程边界。我的情况似乎有点不同,所以我想就最佳选择提出建议:
我没有让很多相同的工作线程等待共享队列中的项目,而是有一些主要是自主的,非守护程序的线程,其中包含有关其业务的唯一标识符。这些线程不会阻塞,通常不会彼此关心。他们大部分时间都在睡觉,并定期醒来。偶尔,基于某些条件,一个线程需要告诉'另一个执行特定操作的线程 - 一个操作 - 对接收线程有意义。动作和收件人有许多不同的组合,因此对每个组合使用事件似乎都很笨拙。队列对象似乎是实现此目的的推荐方法。但是,如果我有一个共享队列并在只有一个收件人线程的队列上发布一个项目,那么每个其他线程都需要监视队列,拉出每个项目,检查它是否发送给它,然后将其放回队列中它是针对另一个线程的。这似乎很多从队列中获取和放置物品。或者,我可以使用路由器' thread:一个共享队列加上每个' normal'线程,与路由器线程共享。普通线程只将项目放入共享队列,路由器提取每个项目,检查它并将其放在收件人的队列中。不过,还有很多来自队列的物品....
还有其他方法可以实现我的目标吗?似乎pub-sub类是正确的方法,但在标准python中没有这样的线程安全模块,至少据我所知。
非常感谢您的建议。
答案 0 :(得分:2)
而不是让许多相同的工作线程等待共享队列中的项目
我认为这是做到这一点的正确方法。只需从上面的语句中删除identical
和shared
即可。即。
让许多工作线程等待队列中的项目
所以我建议使用Celery来实现这种方法。
偶尔,基于某些条件,一个线程需要“告诉” 另一个做特定事情的线程 - 一个对接收线程有意义的动作。
这可以通过从调用任务中调用另一个芹菜任务来完成。所有任务都可以有不同的队列。
答案 1 :(得分:0)
感谢您的回复。经过一番思考,我决定使用许多队列和路由器线程(hub-and-spoke)的方法。每个正常的'线程有其专用队列到路由器,启用单独的发送和接收队列或通道'。路由器的队列由所有线程共享(作为属性)并由“正常”线程使用。线程作为只发送通道,即它们只将项目发布到此队列,并且只有路由器侦听它,即拉取项目。此外,每个正常的'线程使用自己的队列作为“仅接收频道”#39;它在哪里监听,哪些只与路由器共享。线程在路由器队列/通道上注册自己的路由器,路由器维护一个已注册的线程列表,包括它们的队列,因此它可以在注册后将项目发送到特定的线程。
这意味着无法进行点对点通信,所有通信都通过路由器发送。
我这样做有几个原因: 1.线程中没有逻辑用于检查项目是否发送给“我”,使代码更简单,并且不会在一个共享队列上拉动,检查和重新放置项目。线程只监听队列,当消息到达时,线程可以确定消息是否发送给它,包括路由器本身。 2.路由器可以充当消息总线,进行词汇翻译,并且可以将消息发送到外部程序或主机。 3.线程不需要知道任何有关其他线程功能的信息,即它们只是说出路由器的语言。在点对点的世界中,所有同伴必须能够相互理解,并且因为我的线程有许多不同的类,所以我必须教授每个班级的所有其他班级'词汇。
希望有一天在遇到类似的挑战时帮助某人。