事件驱动的线程创建

0 投票
1 回答
617 浏览
提问于 2025-04-16 21:42

我一直在尝试各种方法来解决以下问题,但都没有成功。

我有很多(Python)模块/脚本,还有一个特别的脚本,叫做 K.py。

当 K.py 被执行时,它会生成一些信息,比如一个国家的名字。然后,在其他的模块(有几百个)中,有些模块可以用 K.py 生成的信息(在这个例子中是国家名字)作为输入来执行。接着,这些模块会递归地生成一些信息(比如城镇名字、街道号码等等),这些信息又可以作为其他模块的输入,依此类推……这就会形成一个二叉树的脚本执行结构。

需要注意的几点:

  • 这些模块/脚本(几百个)可以独立运行(它们之间没有任何依赖关系)。
  • 我应该能够在所有模块执行完毕后做出判断(也就是说,运行 K.py 必须等到触发的二叉树中所有模块都执行完毕后才能继续)。

  • 如果我为每个信息 I 和可运行的脚本 S(也就是说,S 可以用 I 作为输入)决定创建一个新的线程,我可能会得到一个指数级数量的线程(对吧?)

我该如何使用 Python 线程(任何 API)来“安全地”实现这个解决方案?(伪代码?)

提前感谢你的智慧。

1 个回答

2

通常解决这个问题的方法是创建一个工作队列,把单个的任务放在里面。也就是说,你需要用某种方式来表示一个线程需要完成的工作。

如果你有了这个表示方式,就可以使用multiprocessing包,它提供了一个“线程”池(见16.3.1.5.),还有一个多线程的队列来存放这些任务。

现在,每个进程从队列中取出一个任务,执行它——可能还会往队列里添加新任务——完成后再去取下一个。等队列空了,你就完成了所有的工作。

需要注意的是,这里使用的是multiprocessing包,因为在CPython中,由于有全局解释器锁(GIL),多线程的Python程序只有在处理大量输入输出或其他阻塞操作时才有优势。

撰写回答