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

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

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

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

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

21
задан P Shved 13 August 2010 в 06:58
поделиться

5 ответов

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()
8
ответ дан 29 November 2019 в 06:38
поделиться

Если вам нужен параллелизм, вот очень простой пример:

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 , чтобы понять, что происходит.

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

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

26
ответ дан 29 November 2019 в 06:38
поделиться

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

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

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

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

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

13
ответ дан 29 November 2019 в 06:38
поделиться

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

1
ответ дан 29 November 2019 в 06:38
поделиться
1
ответ дан 29 November 2019 в 06:38
поделиться
Другие вопросы по тегам:

Похожие вопросы: