我有一些用python编写的脚本。 我试图多线程他们。
脚本A启动时。我想要脚本B,C和D开始。 A运行后,我会A2运行。 B运行后,我会B2跑,然后是B3。 C和D没有后续脚本。
我检查过脚本是否相互独立
我计划使用"exec"
启动它们,并希望在Linux和Windows上使用这个“启动器”。“
我有其他多线程脚本主要做一个有五个线程的程序A.抛弃我,因为所有程序都不同但可以同时启动和运行。
答案 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机器上控制吞吐量并不是一个简单的实用工具。)