Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
python中在线程之间发送消息的推荐方法?_Python_Multithreading - Fatal编程技术网

python中在线程之间发送消息的推荐方法?

python中在线程之间发送消息的推荐方法?,python,multithreading,Python,Multithreading,我已经读了很多关于python线程和各种跨越线程边界“交谈”的方法的书。我的情况似乎有点不同,因此我想获得关于最佳选择的建议: 我没有让许多相同的工作线程在共享队列中等待项目,而是让少数几个主要是自治的、非守护线程使用唯一的标识符来处理它们的业务。这些线程不会阻塞,通常也不关心彼此。他们大部分时间睡觉,定期醒来。有时,基于某些条件,一个线程需要“告诉”另一个线程做一些对接收线程有意义的特定操作。操作和接收者有许多不同的组合,因此对每个组合使用事件似乎很难。队列对象似乎是实现这一点的推荐方法。但是

我已经读了很多关于python线程和各种跨越线程边界“交谈”的方法的书。我的情况似乎有点不同,因此我想获得关于最佳选择的建议:

我没有让许多相同的工作线程在共享队列中等待项目,而是让少数几个主要是自治的、非守护线程使用唯一的标识符来处理它们的业务。这些线程不会阻塞,通常也不关心彼此。他们大部分时间睡觉,定期醒来。有时,基于某些条件,一个线程需要“告诉”另一个线程做一些对接收线程有意义的特定操作。操作和接收者有许多不同的组合,因此对每个组合使用事件似乎很难。队列对象似乎是实现这一点的推荐方法。但是,如果我有一个共享队列,并且在队列上发布了一个只有一个收件人线程的项目,那么其他每个线程都需要监视队列,拉取每个项目,检查它是否是针对它的,如果它是针对另一个线程的,则将它放回队列中。从队列中获取和放置项目的过程似乎很多,但都是徒劳的。或者,我可以使用一个“路由器”线程:一个由所有队列共享,另一个为每个“正常”线程共享,与路由器线程共享。普通线程只将项目放入共享队列,路由器提取每个项目,检查它并将其放入收件人队列。尽管如此,还是有很多人从队列中放置和获取物品

有没有其他方法来实现我需要做的事情?似乎pub子类是正确的方法,但至少据我所知,标准python中没有这样的线程安全模块

非常感谢你的建议

而不是让许多相同的工作线程在共享队列中等待项目

我认为这是正确的做法。只需从上述语句中删除
idential
shared
。i、 e

有许多工作线程在队列中等待项目

所以我建议使用这个方法

有时,基于某些条件,一个线程需要“告诉” 另一个线程执行一些特定的操作——一个对接收线程有意义的操作


这可以通过从调用任务中调用另一个芹菜任务来完成。所有任务都可以有单独的队列。

谢谢您的回复。经过一些思考,我决定使用多队列和路由器线程(集线器和辐条)的方法。每个“普通”线程都有其到路由器的专用队列,支持单独的发送和接收队列或“通道”。路由器的队列由所有线程共享(作为属性),并由“普通”线程用作仅发送通道,即它们仅将项目发送到此队列,并且只有路由器侦听它,即提取项目。此外,每个“普通”线程使用自己的队列作为“仅接收通道”,它在该通道上侦听,并且仅与路由器共享。线程在路由器队列/通道上向路由器注册自己,路由器维护一个包含其队列的已注册线程列表,以便在注册后可以将项目发送到特定线程

这意味着点对点通信是不可能的,所有通信都是通过路由器发送的

我这样做有几个原因: 1.线程中没有逻辑来检查一个项目是否发往“我”,这使得代码更简单,并且没有不断地在一个共享队列中拖拉、检查和重新放置项目。线程只在其队列上侦听,当消息到达时,线程可以确保消息已发送给它,包括路由器本身。 2.路由器可以充当消息总线,进行词汇翻译,并有可能将消息寻址到外部程序或主机。 3.线程不需要知道任何关于其他线程功能的信息,即它们只说路由器的语言。在点对点的世界中,所有的同龄人都必须能够相互理解,因为我的线程来自许多不同的类,所以我必须教每一个类所有其他类的词汇


希望有一天,当人们面临类似的挑战时,这能对他们有所帮助。

我支持芹菜的做法。它支持您所需的每一件事情,而且更简单,因为它处理线程创建。这是一种比使用路由器好得多的方法,因为这意味着您必须处理同步问题