从主脚本并行运行多个 python 脚本

Posted

技术标签:

【中文标题】从主脚本并行运行多个 python 脚本【英文标题】:Run multiple python scripts in parallel from master script 【发布时间】:2021-12-19 11:40:04 【问题描述】:

我想并行运行多个 python 脚本并从一个主脚本启动它们。我确实在之前提出的问题中找到了解决方案,但是,如果并行运行的脚本包含循环,这些都不起作用。 例如,我们定义两个脚本。

脚本 1:

array_1 = []

x = 0
while True:
    array_1.append(x)
    x = x + 1

脚本 2:

array_2 = []

x = 0
while True:
    array_2.append(x)
    x = x + 1

现在我想同时运行这两个进程。以前的解决方案建议主脚本使用以下代码:

import script_1, script_2

exec(open(script_1))
exec(open(script_2))

虽然这是从另一个脚本中启动脚本的解决方案,但是这不会并行运行这两个脚本。 这样的主脚本实际上应该是什么样子?

感谢您的建议!

编辑

我尝试了以下线程方法:

def function_1():
print('function 1 started...')
    while True:
        print('1')
        sleep(1)

def function_2():
print('function 2 started...')
    while True:
        print('2')
        sleep(1)

thread_1 = Thread(target=function_1())
thread_2 = Thread(target=function_2())
thread_1.start()
thread_2.start()


thread_1.join()
thread_2.join()
print("thread finished")

它不起作用,只有第一个函数启动,所以我得到以下输出:

function 1 started...
1
1
1
1
1
1

【问题讨论】:

将子脚本封装在函数中,在新线程中运行每个函数 我希望你不要真的尝试运行该代码,除非你故意试图引发 MemoryError 好的,谢谢。只是一个示例代码;) 我试过了,可惜没用。 你需要将函数作为参数传递,而不是调用它(去掉括号:Thread(target=function1) 【参考方案1】:

当你想产生一个新线程时,你需要传递你希望线程执行的函数的地址,而不是调用它。您在这里所做的实际上是生成一个新线程,该线程立即调用function_1(),当然它会永远运行。

另外,您将无法访问这行代码:

print("thread finished")

由于线程正在执行一个 while 循环 - 永远,所以它是冗余的..

from time import sleep
from threading import Thread


def function_1():
    print('function 1 started...')
    while True:
        print('1')
        sleep(1)


def function_2():
    print('function 2 started...')
    while True:
        print('2')
        sleep(1)


thread_1 = Thread(target=function_1)
thread_2 = Thread(target=function_2)
thread_1.start()
thread_2.start()

thread_1.join()
thread_2.join()
# print("thread finished") - redundant

【讨论】:

以上是关于从主脚本并行运行多个 python 脚本的主要内容,如果未能解决你的问题,请参考以下文章

python脚本如何同时运行多个

如何从 bash 脚本并行运行多个程序?

多个进程共享一个 Joblib 缓存

如何并行运行单个Lua脚本对多个Redis值?

如何从 bash 脚本并行运行多个程序?

运行具有多个程序动态并行的Shell脚本