Предположим, что у меня есть в Python
# A loop
for i in range(10000):
Do Task A
# B loop
for i in range(10000):
Do Task B
Как запустить эти циклы одновременно в Python?
Предположим, что у меня есть в Python
# A loop
for i in range(10000):
Do Task A
# B loop
for i in range(10000):
Do Task B
Как запустить эти циклы одновременно в Python?
Если вы хотите 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.
Почему вы хотите запустить оба процесса одновременно? Это потому, что вы думаете, что они поедут быстрее (есть хорошие шансы, что они не будут). Почему бы не запустить задачи в одном цикле, например.
for i in range(10000):
doTaskA()
doTaskB()
Очевидный ответ на ваш вопрос - использовать потоки - см. модуль python threading. Однако потоки являются большой темой и имеют много подводных камней, поэтому прочитайте ее, прежде чем идти по этому маршруту.
В качестве альтернативы вы можете запускать задачи в отдельных процессах, используя модуль python multiprocessing. Если обе задачи имеют интенсивность процессора, это улучшит использование нескольких ядер на вашем компьютере.
Существуют и другие варианты, такие как сопрограммы, неактивные тасклеты, зеленые точки, CSP и т.д., но, не зная больше о задаче A и задаче B и почему их нужно запускать одновременно, невозможно дать более конкретный ответ.
Существует много возможных вариантов того, что вы хотели:
Как отметили многие люди, это самый простой способ.
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, как использовать их, если вы заинтересованы.
достоинства: более гибкий и легкий
недостатки: необходима дополнительная библиотека, кривая обучения.
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()
Как насчет: цикл для я в диапазоне (10000): выполните ли задание A, задание B? Без дополнительной информации у меня нет лучшего ответа.
Вы можете использовать threading или multiprocessing.
Я считаю, что использование подмодуля "пула" в рамках "многопроцессорности" поразительно работает для одновременного выполнения нескольких процессов в 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!