【问题标题】:Passing updated args to multiple threads periodically in python在python中定期将更新的参数传递给多个线程
【发布时间】:2019-03-02 11:53:19
【问题描述】:

我有三个基站,它们必须并行工作,它们每 10 秒会收到一个列表,其中包含有关其集群的信息,我想运行此代码大约 10 分钟。因此,每 10 秒,我的三个线程必须使用新参数调用目标方法,并且此过程应该持续 10 分钟。我不知道该怎么做,但我想出了以下想法,这似乎不是一个好主意!因此,我感谢任何帮助。

我有一个名为 base_centroid_assign 的列表,我想将它的每个项目传递给不同的线程。列表内容会经常更新(比如10秒),所以想回忆一下我之前的帖子,把更新的项目给他们。

在下面的代码中,列表包含三个项目,其中包含多个项目(它是嵌套的)。我想让三个线程在执行完相当简单的目标函数后停止,然后用更新项调用线程;但是,当我运行下面的代码时,我得到了 30 个线程! (run_time 变量为 10,列表长度为 3)。

如何实现上述想法?

run_time = 10

def cluster_status_broadcasting(info_base_cent_avr):
    print(threading.current_thread().name)
    info_base_cent_avr.sort(key=lambda item: item[2], reverse=True)


start = time.time()

while(run_time > 0):
    for item in base_centroid_assign:
        t = threading.Thread(target=cluster_status_broadcasting, args=(item,))
        t.daemon = True
        t.start()

    print('Entire job took:', time.time() - start)
    run_time -= 1

【问题讨论】:

标签: python multithreading


【解决方案1】:

欢迎来到 Stackoverflow。

线程同步问题可能很难处理,以至于 Python 已经有一些非常有用的库专门用于处理此类任务。主要的此类库是 Python 3 中的queue.Queue。这个想法是为每个“工作”线程设置一个队列。主线程收集 put 新数据到队列中,并让子线程 get 来自该队列的数据。

当您调用Queueget 方法时,它的正常操作是阻塞线程直到有东西可用,但大概您希望线程继续处理当前输入直到有新输入可用,其中如果主线程没有任何内容,轮询队列并继续处理当前数据会更有意义。

我在对this question 的回答中概述了这种方法,但在这种情况下,工作线程实际上是在另一个队列上发送返回值。

工作线程的run 方法的结构需要类似于以下伪代码:

def run(self):
    request_data = self.inq.get()  # Wait for first item
    while True:
        process_with(request_data)
        try:
            request_data = self.inq.get(block=False)
        except queue.Empty:
            continue

您可能希望添加逻辑以在收到 None 等标记值时干净地终止线程。

【讨论】:

  • 感谢您的全面回答,我搜索并发现我也必须使用队列才能处理此类任务;但是,我的一位同事说,您不会在 python 多线程中获得明显的性能。我将上传最终代码。现在,我会将您的答案标记为正确的。
  • 多线程在很大程度上取决于问题的性质。我在更新电子邮件计费程序以使用 200 个线程并避免由于 DNS 延迟等而导致速度下降时取得了很好的效果。 YMMV。\
  • @Squishy33 多线程有助于 IO 绑定进程(必须等待网络响应、磁盘读取、处理发生在 CPU 以外的设备上的任何事情)。当进程受 CPU 限制时,多线程是有害的,因为 Python 只允许在单个进程中一次运行一个线程(由全局解释锁或 GIL 控制)。您的同事要么不是很了解情况,要么担心受 CPU 限制的进程。 (您可能在观看我链接的视频时已经意识到这一点,但如果其他人将来阅读此信息,请留下信息。)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2017-03-27
  • 1970-01-01
  • 2012-01-03
  • 1970-01-01
  • 2018-06-29
  • 2013-04-20
  • 1970-01-01
相关资源
最近更新 更多