我有两个脚本Server.py和ServerGUI.py。我希望它们独立并行运行。假设我制作了另一个脚本main.py。我如何从main运行Server.py和ServerGUI.py?
你能给我推荐main.py的代码吗?
要在python脚本中运行2个或多个脚本,可以使用带有nohup的子流程包。这将在后台运行每个脚本,允许您从同一源脚本并行运行它们。此外,作为一个选项,本示例将把每个脚本的标准输出保存在不同的文件中
import os
from subprocess import call
from subprocess import Popen
# subprocess.call(['python', 'exampleScripts.py', somescript_arg1, somescript_val1,...]).
Popen(['nohup', 'python', 'exampleScripts.py'],
stdout=open('null1', 'w'),
stderr=open('logfile.log', 'a'),
start_new_session=True )
Popen(['nohup', 'python', 'exampleScripts.py'],
stdout=open('null2', 'w'),
stderr=open('logfile.log', 'a'),
start_new_session=True )
Popen(['nohup', 'python', 'exampleScripts.py'],
stdout=open('null3', 'w'),
stderr=open('logfile.log', 'a'),
start_new_session=True )
输出:每个脚本中的开始和结束时间重叠,显示第二个脚本在第一个脚本结束之前开始
(ds_tensorflow) C:DataScienceSampleNotebooksThreading>python RunScripts.py
(ds_tensorflow) C:DataScienceSampleNotebooksThreading>cat null*
2020-07-13 15:46:21.251606
List processing complete.
2020-07-13 15:46:29.130219
2020-07-13 15:46:22.501599
List processing complete.
2020-07-13 15:46:31.227954
2020-07-13 15:46:23.758498
List processing complete.
2020-07-13 15:46:32.431079
如果你想把代码放在一个地方,你也可以在函数中使用同样的想法。本例将并行运行两个不同的函数两次。
功能示例:
...
import threading
...
def some_function()
# code
def other_function()
# code
if __name__ == "__main__":
jobs = []
#same function run multiple times
threads = 2
for i in range(0, threads):
out_list = list()
thread1 = threading.Thread(target=some_function(size, i, out_list))
jobs.append(thread1)
thread2 = threading.Thread(target=other_function(size, i, out_list))
jobs.append(thread2)
# Start the threads (i.e. calculate the random number lists)
for j in jobs:
j.start()
# Ensure all of the threads have finished
for j in jobs:
j.join()
# continue processing
您可以使用threading
或multiprocessing
'并行运行python脚本。
线程:https://www.tutorialspoint.com/python/python_multithreading.htm
多处理器:https://www.tutorialspoint.com/multiprocessing-in-python#:~:text=%20多处理%20包%20支持%20派生,与%20线程%20模块%20相似。
希望这能帮助你
您可以按照以下方式执行操作(例如,我假设您的脚本接受两个参数arg1
和arg2
。这需要根据您的具体需求进行修改。(:
- 如果你有"主";server.py和servergui.py中的函数:
import threading
from server import server_main
from servergui import server_gui_main
thread_list = []
thread_list.append(
threading.Thread(target=server_main, args=(arg1, arg2))
)
thread_list.append(
threading.Thread(target=server_gui_main, args=(arg1, arg2))
)
for thread in thread_list:
thread.start()
for thread in thread_list:
thread.join()
以上内容将在单独的线程中启动两个主要函数。
如果您想要单独的并行进程,请使用multithreading
:
import multiprocessing
process_list = []
process_list.append(
multiprocessing.Process(target=server_main, args=(arg1, arg2))
)
process_list.append(
multiprocessing.Process(target=server_gui_main, args=(arg1, arg2))
)
for process in process_list:
process.start()
for process in process_list:
process.join()
如您所见,multiprocessing
和threading
的API差异很小。但是,如果执行CPU受限的任务,threading
可能会影响您的性能。这是因为Python GIL强制Python在任何给定时刻只运行一个线程。因此,如果您有CPU密集型任务,则应该使用multiprocessing
,因为这会创建确实并行运行的独立进程。
- 如果您想像从命令行启动server.py和servergui.py一样启动它们:
import subprocess
subprocess.run(
['python', 'server.py', 'arg1', 'arg2'],
shell=True
)
subprocess.run(
['python', 'servergui.py', 'arg1', 'arg2'],
shell=True
)