Python: How to run multiple files at the same time?

混江龙づ霸主 提交于 2021-01-29 08:13:03

问题


I'm trying to create a For-loop which automatically starts different python files at the exact same time, but they always seem to run one after one.

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 are the files I'm trying to run at the same time, but they get executed one after one, so if the code is:

time.sleep(10)
print("hello)

I will have to wait 30 seconds for the program to be done, instead of the 10 seconds I want.


回答1:


If you want to start the files in three separate interpreters, start them as subprocesses:

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()



回答2:


If you want to keep using multiprocessing, you can just encapsulate your system calls in a function:

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()



回答3:


Based on OP's actual goal from a comment:

I'm trying to open different links at the same time in my browser with the webbrowser module. Essentially time.sleep(10) webbrowser.open("google.com") But the link is different in each file

we can instead use threads. I added the option for a different delay per URL, because otherwise there'd be no point in having each thread sleep on its own.

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


来源:https://stackoverflow.com/questions/55472847/python-how-to-run-multiple-files-at-the-same-time

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!