Запуск многопользовательских процессов Python из одного файла Python - PullRequest
0 голосов
/ 08 февраля 2019

Допустим, у меня есть три модуля:

mod1 mod2 mod3

, где каждый из них работает бесконечно долго, как только вызывается mod.launch ().

ЧтоКакие-нибудь изящные способы запустить все эти бесконечные циклы одновременно, не дожидаясь завершения одного из них, прежде чем вызывать другой?

Допустим, у меня есть что-то вроде launcher.py, где я бы попытался:

import mod1
import mod2
import mod3

if __name__ == "__main__":
    mod1.launch()
    mod2.launch()
    mod3.launch()

Это, очевидно, не работает, так как будет ожидать завершения mod1.launch () перед запуском mod2.launch ().

Любая помощь приветствуется.

Ответы [ 4 ]

0 голосов
/ 08 февраля 2019

Я бы предложил использовать Ray , которая является библиотекой для параллельного и распределенного Python.Он обладает некоторыми преимуществами по сравнению со стандартными библиотеками потоков и многопроцессорных систем.

  • Один и тот же код будет выполняться на одной или нескольких машинах.
  • Вы можете распараллеливать функции и классы.
  • Объекты эффективно распределяются между задачами, использующими разделяемую память.

Чтобы обеспечить простой исполняемый пример, я буду использовать функции и классы вместо модулей, но вы всегда можете обернуть модуль вфункция или класс.

Подход 1: Параллельные функции с использованием задач .

import ray
import time

ray.init()

@ray.remote
def mod1():
    time.sleep(3)

@ray.remote
def mod2():
    time.sleep(3)

@ray.remote
def mod3():
    time.sleep(3)

if __name__ == '__main__':
    # Start the tasks. These will run in parallel.
    result_id1 = mod1.remote()
    result_id2 = mod2.remote()
    result_id3 = mod3.remote()

    # Don't exit the interpreter before the tasks have finished.
    ray.get([result_id1, result_id2, result_id3])

Подход 2: Параллельные классы используя актеров .

import ray
import time

# Don't run this again if you've already run it.
ray.init()

@ray.remote
class Mod1(object):
    def run(self):
        time.sleep(3)

@ray.remote
class Mod2(object):
    def run(self):
        time.sleep(3)

@ray.remote
class Mod3(object):
    def run(self):
        time.sleep(3)

if __name__ == '__main__':
    # Create 3 actors.
    mod1 = Mod1.remote()
    mod2 = Mod2.remote()
    mod3 = Mod3.remote()

    # Start the methods, these will run in parallel.
    result_id1 = mod1.run.remote()
    result_id2 = mod2.run.remote()
    result_id3 = mod3.run.remote()

    # Don't exit the interpreter before the tasks have finished.
    ray.get([result_id1, result_id2, result_id3])

Вы можете просмотреть документацию Ray .

0 голосов
/ 08 февраля 2019

В зависимости от характера работы, выполняемой в каждой задаче, ответ может быть разным.

Если каждая задача в основном или полностью связана с IO, я бы рекомендовал многопоточность.

Если каждаязадача связана с процессором, я бы рекомендовал многопроцессорность (из-за GIL в python).

0 голосов
/ 08 февраля 2019

Вы также можете использовать модуль threading для запуска каждого модуля в отдельном потоке, но в рамках одного и того же процесса:

import threading
import mod1
import mod2
import mod3

if __name__ == "__main__":
    # make a list of all modules we want to run, for convenience
    mods = [mod1, mod2, mod3] 
    # Prepare a thread for each module to run the `launch()` method
    threads = [threading.Thread(target=mod.launch) for mod in mods]
    # run all threads
    for thread in threads:
        thread.start()
    # wait for all threads to finish
    for thread in threads:
        thread.join()

multiprocess*Модуль 1009 * выполняет очень похожий набор задач и имеет очень похожий API, но использует отдельные процессы вместо потоков, так что вы можете использовать это тоже.

0 голосов
/ 08 февраля 2019

Если вы хотите выполнять несколько функций параллельно, вы можете использовать либо многопроцессорную библиотеку , либо concurrent.futures.ProcessPoolExecutor .ProcessPoolExecutor использует внутреннюю многопроцессорную обработку, но имеет более простой интерфейс.

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