2011-07-17 66 views
0

我一直在尝试各种解决方案以解决以下问题;无济于事。事件驱动的线程创建

我有大量的(python)模块/脚本和高级脚本K.py。

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

注意事项。

  • 模块/脚本(数百个)以上可独立运行(不-依赖间以任何方式)
  • 我应该能够把当所有模块已经完成执行判决(这是运行K.py必须阻塞,直到excecuting模块的触发二叉树被“加入”)。如果对于每个信息I和可运行脚本S(即S可能以I作为输入运行),我决定创建一个新的线程,最终可能会有一个指数数量的线程(No ?)

如何使用python线程(任何API)来'安全地'实现解决方案? (pseudo_code?)

在此先感谢您的智慧。

回答

2

解决此问题的常用方法是创建工作队列并将单个作业存储在那里。所以你需要某种应该由一个线程完成的工作的程序化表示。

如果您有可以使用提供“线程”池(请参见16.3.1.5。)的multiprocessing package以及一个多线程队列来存储作业。

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

请注意,它使用多处理程序包,因为至少在CPython中使用GIL时,多线程python程序仅适用于大型IO或其他阻塞活动。

+0

感谢Voo。 我正在尝试多处理包。 (我正在考虑用替代方法来表示'工作',正如Pool所说的(..)需要腌制的等等)。 非常感谢。 – dop

+0

我不确定Pool的意思()(没有看到这样的方法?)和酸洗。就我个人而言,我只是创建一个while循环,从队列中移除第一个元素并处理它。如果队列为空,则所有线程都返回并完成。您通过创建队列,将第一份作业放入其中,然后使用该池来启动该过程。 – Voo