Запуск нескольких сценариев из одного сценария в python - PullRequest
1 голос
/ 13 июля 2020

У меня есть два скрипта Server.py и Server GUI .py . Я хочу, чтобы они работали независимо и параллельно. Скажем, я создаю еще один скрипт main.py . Как я могу запустить Server.py и Server GUI .py из main.py ?

Можете ли вы предложить мне код для main.py ?

Ответы [ 3 ]

0 голосов
/ 13 июля 2020

Вы можете сделать что-то в этом роде (для примера я предположил, что ваши скрипты принимают два аргумента, arg1 и arg2. Это необходимо изменить в соответствии с вашими требованиями c):

  1. Если у вас есть «основные» функции в server.py и server gui .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()

Как видите, различия в API multiprocessing и threading невелики. Однако ваша производительность может пострадать от threading, если вы выполняете задачи, связанные с процессором. Это потому, что Python GIL заставляет Python запускать только один поток в любой момент. Таким образом, если у вас есть задачи, интенсивно использующие ЦП, вы должны использовать multiprocessing, так как это создает отдельные процессы, которые действительно выполняются параллельно.

Если вы хотите запустить server.py и server gui .py, как если бы вы запускали их из командной строки:
import subprocess

subprocess.run(
    ['python', 'server.py', 'arg1', 'arg2'],
    shell=True
)

subprocess.run(
    ['python', 'servergui.py', 'arg1', 'arg2'],
    shell=True
)
0 голосов
/ 13 июля 2020

Чтобы запустить 2 или более сценария из сценария python, вы можете использовать пакет subprocess с 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:\DataScience\SampleNotebooks\Threading>python RunScripts.py

(ds_tensorflow) C:\DataScience\SampleNotebooks\Threading>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
0 голосов
/ 13 июля 2020

Вы можете использовать threading или multiprocessing 'для параллельного запуска сценариев python.

Многопоточность: https://www.tutorialspoint.com/python/python_multithreading.htm

Многопроцессорность: https://www.tutorialspoint.com/multiprocessing-in-python#: ~: text = The% 20multiprocessing% 20package% 20supports% 20spawning,% 20similar% 20to% 20threading% 20module .

Надеюсь, это поможет вам

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...