多线程不同的脚本

时间:2011-02-23 15:42:36

标签: python multithreading

我有一些用python编写的脚本。 我试图多线程他们。

脚本A启动时。我想要脚本B,C和D开始。 A运行后,我会A2运行。 B运行后,我会B2跑,然后是B3。 C和D没有后续脚本。

我检查过脚本是否相互独立 我计划使用"exec"启动它们,并希望在Linux和Windows上使用这个“启动器”。“

我有其他多线程脚本主要做一个有五个线程的程序A.抛弃我,因为所有程序都不同但可以同时启动和运行。

2 个答案:

答案 0 :(得分:2)

好的,我仍然不确定你的问题究竟在哪里,但这就是我解决问题的方法:

#Main.py
from multiprocessing import Process
import ScriptA
# import all other scripts as well

def handle_script_a(*args):
    print("Call one or several functions from Script A or calculate some stuff beforehand")
    ScriptA.foo(*args)

if __name__ == '__main__':
    p = Process(target=handle_script_a, args=("Either so", ))
    p1 = Process(target=ScriptA.foo, args=("or so", ))
    p.start()
    p1.start()
    p.join()
    p1.join()

# ScriptA.py:
def foo(*args):
    print("Function foo called with args:")
    for arg in args:
        print(arg)

您可以直接调用函数,或者如果要在一个进程中调用多个函数,请使用一个小包装器。没有平台相关的代码,没有丑陋的高管,你可以轻易地以任何方式创建/加入流程。

一个用于进程间通信的队列的一个小例子 - 几乎从python API中窃取但是很好;)

from multiprocessing import Process, Queue

def f(q):
    q.put([42, None, 'hello'])

if __name__ == '__main__':
    q = Queue()
    p = Process(target=f, args=(q,))
    p.start()
    print(q.get())    # prints "[42, None, 'hello']"
    p.join()

创建队列并为其提供一个或多个进程。注意get()块,如果你想要非阻塞,你可以使用get_nowait()或指定超时作为第二个参数。如果你想要共享对象,那就有多处理.Array或multiprocessing.Value,只需阅读文档以获取具体信息doc link 如果你有更多关于IPC的问题,请创建一个新问题 - 这本身就是一个非常大的话题。

答案 1 :(得分:0)

所以它不一定是Python启动器?当我做重型系统管理员时,我使用POE框架编写了一个Perl脚本来运行脚本或任何具有有限并发性的脚本。工作得很好。例如,当我们必须在一千个用户帐户或几百个数据库上运行脚本时。在4-cpu盒子上一次只限制4个作业,在16路服务器上限制16个,或任意数字。 POE确实使用fork()来创建子进程,但是在Windows下,在cygwin,FWIW下工作正常。

前段时间我一直在寻找Python的等效事件框架。今天再看一下,我看到Twisted - 以及一些帖子表明它比POE运行得更快 - 但是Twisted主要用于网络客户端/服务器? POE非常灵活。如果你不习惯事件驱动的脚本,那么一开始就很棘手,即使你是这样,但是事件比线程更容易受到攻击。 (可能会因为您的需求而过度杀戮?几年后,我仍然感到惊讶的是,在多CPU机器上控制吞吐量并不是一个简单的实用工具。)