【问题标题】:Event-driven thread creation事件驱动的线程创建
【发布时间】:2011-10-07 02:49:58
【问题描述】:

我一直在尝试各种解决以下问题的方法;无济于事。

我有大量(python)模块/脚本和一个杰出的脚本,K.py。

当 K.py 被执行时,它会生成一些信息,比如一个国家名称。现在,在其他模块(数百个)中,将有一些模块可以使用由 K.py 生成的信息(在本例中为国家名称)作为输入传递给它们来执行。递归地,上面的每个模块都会生成一些信息(城镇名称、街道号码等),这些信息可以作为其他模块的输入,等等.. 这当然会导致执行脚本的二叉树..

注意事项。

  • 上面的模块/脚本(数百个)可以独立运行(它们不会以任何方式相互依赖)
  • 我应该能够在所有模块都完成执行后做出判断(运行的 K.py 必须阻塞,直到正在执行的模块的触发二叉树被“加入”)。

  • 1234563没有?)

如何使用 python 线程(任何 API)“安全地”实施解决方案? (伪代码?)

提前感谢您的智慧。

【问题讨论】:

    标签: python multithreading consumer producer


    【解决方案1】:

    解决这个问题的常用方法是创建一个工作队列并将单个作业存储在那里。因此,您需要对应该由一个线程完成的工作进行某种编程表示。

    如果你有,你可以使用multiprocessing package,它提供了一个“线程”池(参见 16.3.1.5.)和一个多线程队列来存储作业。

    现在每个进程从队列中获取一个作业,执行它 - 可能会向队列中添加新作业 - 当它完成时获取下一个作业。当队列为空时,您就完成了。

    请注意,这使用了 multiprocessing 包,因为至少在带有 GIL 的 CPython 中,多线程 python 程序仅在大 IO 或其他阻塞活动的情况下才有优势。

    【讨论】:

    • 谢谢你。我正在尝试多处理包。 (我正在考虑表示“工作”的替代方法,因为所述池的 put(..) 需要腌制等)。非常感谢。
    • 我不确定你对 Pool put() 的意思(没有看到这样的方法?)和酸洗。就我个人而言,我只是创建一个 while 循环,从队列中删除第一个元素并处理它。如果队列为空,所有线程都返回,我们就完成了。您可以通过创建队列、将第一个作业放入其中然后使用池来启动该过程。
    猜你喜欢
    • 2011-10-26
    • 2010-12-25
    • 2020-02-02
    • 1970-01-01
    • 1970-01-01
    • 2018-01-03
    • 2011-03-08
    • 2015-10-06
    • 1970-01-01
    相关资源
    最近更新 更多