Python 多线程不同脚本

Python 多线程不同脚本,python,multithreading,Python,Multithreading,我有一些用python编写的脚本。 我正在尝试多线程 当脚本A启动时。我希望脚本B、C和D开始。 跑步之后,我想跑步。 B运行之后,我将运行B2,然后运行B3。 C和D没有后续脚本 我已检查脚本是否相互独立。 我计划使用“exec”启动它们,并希望在Linux和Windows上使用此“启动器” 我还有其他多线程脚本,主要是用五个线程执行一个过程a。这让我很头疼,因为所有过程都不同,但可以同时启动和运行。好的,我仍然不确定您的问题到底在哪里,但这就是我解决问题的方法: #Main.py from

我有一些用python编写的脚本。 我正在尝试多线程

当脚本A启动时。我希望脚本B、C和D开始。 跑步之后,我想跑步。 B运行之后,我将运行B2,然后运行B3。 C和D没有后续脚本

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


我还有其他多线程脚本,主要是用五个线程执行一个过程a。这让我很头疼,因为所有过程都不同,但可以同时启动和运行。

好的,我仍然不确定您的问题到底在哪里,但这就是我解决问题的方法:

#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中偷来的,但很好;)

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

这样就不必是Python启动器了吗?回到我做繁重的系统管理时,我使用POE框架编写了一个Perl脚本来运行脚本或其他具有有限并发性的脚本。效果非常好。例如,当我们不得不运行脚本时超过1000个用户帐户或几百个数据库。在一个4 cpu机箱上一次只能执行4个作业,在16路服务器上一次只能执行16个作业,或者任意数量。POE确实使用fork()创建子进程,但在cygwin、FWIW下运行良好的Windows机箱上


前一段时间,我在寻找一个与Python等效的事件框架。今天再看一遍,我看到Twisted——还有一些帖子指出它的运行速度甚至比POE还要快——但也许Twisted主要用于网络客户端/服务器?POE非常灵活。如果你不习惯于事件驱动脚本,那么一开始会很棘手,即使你是,但是events要比线程容易得多。(可能是为了满足您的需求而过度杀戮?几年后,我仍然感到惊讶的是,没有一个简单的实用程序来控制多cpu机器上的吞吐量。)

您的问题到底是什么?我个人根本不会使用exec,只是将所有脚本链接在一起并使用多处理库,但exec方法也应该可以工作。这是多进程。多线程将如何改变。我过去没有使用导入脚本。好主意!我如何添加ScriptA2和ScriptB,ScriptB2,在哪里?假设存在线程。好吧,多处理库与线程库几乎可以互换,但是如果你想让它们真正并行运行,就不应该使用线程(至少在CPython中;详细信息请查阅全局解释器锁)。由于您不需要在进程之间进行通信,程序也不会变得更复杂(如果需要,在多处理包中有管道和队列实现)。您只需像ScriptA一样导入它们。谢谢。让我考虑一下进程与线程。您可以将队列添加到您的答案中,以便我可以将其标记为正确。
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()