我正在尝试创建一个For循环,该循环会自动在同一时间自动启动不同的python文件,但它们似乎总是一个接一个地运行。
import os
import multiprocessing
import p1, p2, p3
#first idea
path = "C:" + "\\Users\\Max\\\\Desktop\\\python\\tasks\\"
tasks = ['p1.py', 'p2.py', 'p3.py']
len = tasks.__len__()
ind = 0
for i in range(len):
os.system('python' + ' ' + tasks[ind])
ind += 1
#second idea
for x in ('p1', 'p2', 'p3'):
p = multiprocessing.Process(target=lambda: __import__(x))
p.start()
p1,p2,p3是我试图同时运行的文件,但是它们是一个接一个地执行的,所以如果代码是:
time.sleep(10)
print("hello)
我将需要等待30秒才能完成程序,而不是我想要的10秒。
答案 0 :(得分:2)
如果要在三个单独的解释器中启动文件,请将它们作为子进程启动:
import subprocess
path = r"C:\Users\Max\Desktop\python\tasks"
tasks = ['1.py', '2.py', '3.py']
task_processes = [
subprocess.Popen(r'python %s\%s' % (path, task), shell=True)
for task
in tasks
]
for task in task_processes:
task.wait()
答案 1 :(得分:1)
如果您想继续使用多重处理,则可以将系统调用封装在一个函数中:
import os
from multiprocessing import Process
path = "C:\\Users\\Max\\\\Desktop\\\python\\tasks\\"
tasks = ['1.py', '2.py', '3.py']
def foo(task):
os.system('python ' + path + task)
for task in tasks:
p = Process(target=foo, args=(task,))
p.start()
答案 2 :(得分:0)
基于OP的评论的实际目标:
我正在尝试使用webbrowser模块在浏览器中同时打开不同的链接。本质上
time.sleep(10) webbrowser.open("google.com")
,但是每个文件中的链接都不同
我们可以改用线程。我添加了针对每个URL的不同延迟的选项,因为否则,没有必要让每个线程自己休眠。
import webbrowser
import threading
import time
def delayed_open_url(delay, url):
time.sleep(delay)
webbrowser.open(url)
threads = []
for delay, url in [
(3, "http://google.com"),
(5, "http://example.com"),
(11, "http://stackoverflow.com"),
]:
threads.append(
threading.Thread(target=delayed_open_url, args=(url,)).start()
)
for thread in threads:
thread.join() # Wait for each thread
# This code will be executed after each thread is done