Как запустить одновременно две петли python?

Предположим, что у меня есть в Python

# A loop
for i in range(10000):
    Do Task A

# B loop
for i in range(10000):
    Do Task B

Как запустить эти циклы одновременно в Python?

Ответы

Ответ 1

Если вы хотите concurrency, вот очень простой пример:

from multiprocessing import Process

def loop_a():
    while 1:
        print("a")

def loop_b():
    while 1:
        print("b")

if __name__ == '__main__':
    Process(target=loop_a).start()
    Process(target=loop_b).start()

Это самый простой пример, о котором я мог думать. Обязательно прочитайте http://docs.python.org/library/multiprocessing.html, чтобы понять, что происходит.

Если вы хотите отправить данные обратно в программу, я бы рекомендовал использовать Queue (что в моем опыте проще всего использовать).

Вместо этого вы можете использовать поток, если не хотите блокировать глобальный интерпретатор . Процессы более дороги для создания экземпляров, но они предлагают true concurrency.

Ответ 2

Почему вы хотите запустить оба процесса одновременно? Это потому, что вы думаете, что они поедут быстрее (есть хорошие шансы, что они не будут). Почему бы не запустить задачи в одном цикле, например.

for i in range(10000):
    doTaskA()
    doTaskB()

Очевидный ответ на ваш вопрос - использовать потоки - см. модуль python threading. Однако потоки являются большой темой и имеют много подводных камней, поэтому прочитайте ее, прежде чем идти по этому маршруту.

В качестве альтернативы вы можете запускать задачи в отдельных процессах, используя модуль python multiprocessing. Если обе задачи имеют интенсивность процессора, это улучшит использование нескольких ядер на вашем компьютере.

Существуют и другие варианты, такие как сопрограммы, неактивные тасклеты, зеленые точки, CSP и т.д., но, не зная больше о задаче A и задаче B и почему их нужно запускать одновременно, невозможно дать более конкретный ответ.

Ответ 3

Существует много возможных вариантов того, что вы хотели:

использовать цикл

Как отметили многие люди, это самый простой способ.

for i in xrange(10000):
    # use xrange instead of range
    taskA()
    taskB()

Достоинства: легко понять и использовать, не требуется дополнительная библиотека.

Недостатки: taskB должен выполняться после taskA или иначе. Они не могут работать одновременно.

несколько процессов

Еще одна мысль: запустить одновременно два процесса, python предоставляет многопроцессорную библиотеку, следующий пример:

from multiprocessing import Process


p1 = Process(target=taskA, args=(*args, **kwargs))
p2 = Process(target=taskB, args=(*args, **kwargs))

p1.start()
p2.start()

Достоинства: задача может быть запущена simultaneously в фоновом режиме, вы можете управлять задачами (заканчивать, останавливать их и т.д.), задачи могут обмениваться данными, могут быть синхронизированы, если они конкурируют с одними и теми же ресурсами и т.д.

Недостатки: слишком тяжелая ОС часто будет переключаться между ними, у них есть собственное пространство данных, даже если данные избыточны. Если у вас много задач (скажем, 100 или более), это не то, что вы хотите.

резьбонарезной

Threading похожа на процесс, просто легкий. проверьте этот пост. Их использование очень похоже:

import threading 


p1 = threading.Thread(target=taskA, args=(*args, **kwargs))
p2 = threading.Thread(target=taskB, args=(*args, **kwargs))

p1.start()
p2.start()

сопрограммы

библиотеки, такие как greenlet и gevent, обеспечивают нечто, называемое сопрограммами, которые должны быть быстрее, чем потоки. Никаких примеров, пожалуйста, Google, как использовать их, если вы заинтересованы.

достоинства: более гибкий и легкий

недостатки: необходима дополнительная библиотека, кривая обучения.

Ответ 4

from threading import Thread
def loopA():
    for i in range(10000):
        #Do task A
def loopB():
    for i in range(10000):
        #Do task B
threadA = Thread(target = loopA)
threadB = Thread(target = loobB)
threadA.run()
threadB.run()
# Do work indepedent of loopA and loopB 
threadA.join()
threadB.join()

Ответ 5

Как насчет: цикл для я в диапазоне (10000): выполните ли задание A, задание B? Без дополнительной информации у меня нет лучшего ответа.

Ответ 7

Я считаю, что использование подмодуля "пула" в рамках "многопроцессорности" поразительно работает для одновременного выполнения нескольких процессов в Python Script.

См. раздел: Использование пула работников

Посмотрите внимательно на "# запуск нескольких оценок асинхронно может использовать больше процессов" в примере. Как только вы поймете, что делают эти строки, следующий пример, который я построил, будет иметь большой смысл.

import numpy as np
from multiprocessing import Pool

def desired_function(option, processes, data, etc...):
    # your code will go here. option allows you to make choices within your script
    # to execute desired sections of code for each pool or subprocess.

    return result_array   # "for example"


result_array = np.zeros("some shape")  # This is normally populated by 1 loop, lets try 4.
processes = 4
pool = Pool(processes=processes)
args = (processes, data, etc...)    # Arguments to be passed into desired function.

multiple_results = []
for i in range(processes):          # Executes each pool w/ option (1-4 in this case).
    multiple_results.append(pool.apply_async(param_process, (i+1,)+args)) # Syncs each.

results = np.array(res.get() for res in multiple_results)  # Retrieves results after
                                                           # every pool is finished!

for i in range(processes):
    result_array = result_array + results[i]  # Combines all datasets!

В основном будет выполняться желаемая функция для определенного количества процессов. Вам нужно будет тщательно убедиться, что ваша функция может различать каждый процесс (следовательно, почему я добавил параметр "option".) Кроме того, он не должен быть массивом, который заполняется в конце, но для моего примера, как я его использовал. Надеюсь, это упростит или поможет вам лучше понять мощь многопроцессорности в Python!