Как запустить одновременно две петли 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? Без дополнительной информации у меня нет лучшего ответа.
Ответ 6
Вы можете использовать threading или multiprocessing.
Ответ 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!