Сделайте 2 функции запущенными одновременно - PullRequest
36 голосов
/ 02 июня 2010

Я пытаюсь запустить 2 функции одновременно.

def func1():
    print 'Working'

def func2():
    print 'Working'

func1()
func2()

Кто-нибудь знает, как это сделать?

Ответы [ 7 ]

65 голосов
/ 02 июня 2010

Сделайте это:

from threading import Thread

def func1():
    print 'Working'

def func2():
    print 'Working'

if __name__ == '__main__':
    Thread(target = func1).start()
    Thread(target = func2).start()
10 голосов
/ 02 июня 2010

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

Если у вас есть две функции, которые используют много ресурсов ЦП, многопоточность (в CPython), вероятно, ни к чему не приведет. Тогда вы можете захотеть взглянуть на многопроцессорный модуль или, возможно, захотите использовать jython / IronPython.

Если причина связана с производительностью процессора, вы могли бы даже реализовать вещи в (не поточной) C и получить гораздо большее ускорение, чем две параллельные вещи в python.

Без дополнительной информации найти хороший ответ нелегко.

4 голосов
/ 11 октября 2015

Одна опция, которая выглядит так, как будто две функции запускаются одновременно
время
, используется модуль threading (пример в этот ответ).

Тем не менее, он имеет небольшую задержку, как официальная документация Python
страница описывает. Лучший модуль для использования - multiprocessing.

Также есть и другие модули Python, которые можно использовать для асинхронного выполнения (две части кода работают одновременно). Чтобы получить информацию о них и помочь выбрать один из них, вы можете прочитать этот вопрос переполнения стека.

Комментарий другого пользователя о модуле threading

Он может захотеть узнать это из-за Глобальной блокировки интерпретатора
они не будут выполняться одновременно, даже если машина в
Вопрос имеет несколько процессоров. wiki.python.org / МойнМойн / GlobalInterpreterLock

- Йонас Эльфстрём 2 июня 2010 г. в 11: 39

Цитата из документации о threading модуль не работает

Детали реализации CPython: в CPython, благодаря глобальному переводчику
Блокировка, только один поток может выполнять код Python одновременно (даже если
некоторые ориентированные на производительность библиотеки могут преодолеть это ограничение).

Если вы хотите, чтобы ваше приложение лучше использовало вычислительные ресурсы многоядерных машин, рекомендуется использовать многопроцессорную обработку или concurrent.futures.ProcessPoolExecutor.
Тем не менее, многопоточность по-прежнему является подходящей моделью, если вы
хотите одновременно выполнять несколько задач, связанных с вводом / выводом.

2 голосов
/ 04 февраля 2019

Это можно сделать элегантно с Ray , системой, которая позволяет вам легко распараллеливать и распространять ваш код Python.

Чтобы распараллелить ваш пример, вам нужно определить свои функции с помощью @ray.remote decorator, а затем вызвать их с помощью .remote.

import ray

ray.init()

# Define functions you want to execute in parallel using 
# the ray.remote decorator.
@ray.remote
def func1():
    print("Working")

@ray.remote
def func2():
    print("Working")

# Execute func1 and func2 in parallel.
ray.get([func1.remote(), func2.remote()])

Если func1() и func2() возвращают результаты, вам нужно немного переписать приведенный выше код, заменив ray.get([func1.remote(), func2.remote()]) на:

ret_id1 = func1.remote()
ret_id2 = func1.remote()
ret1, ret2 = ray.get([ret_id1, ret_id2])

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

Подробнее о Луче см. этот пост .

0 голосов
/ 14 августа 2018

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

from threading import Thread
import time

def func1():
    print 'Working'
    time.sleep(2)

def func2():
    print 'Working'
    time.sleep(2)

th = Thread(target=func1)
th.start()
th1=Thread(target=func2)
th1.start()
0 голосов
/ 28 июля 2018

Потоковый модуль работает одновременно, в отличие от многопроцессорных, но время немного не работает. Код ниже печатает «1» и «2». Они вызываются разными функциями соответственно. Я заметил, что при выводе на консоль у них будет немного другое время.

   from threading import Thread

   def one():
       while(1 == num):
           print("1")
           time.sleep(2)

   def two():
       while(1 == num):
           print("2")
           time.sleep(2)


   p1 = Thread(target = one)
   p2 = Thread(target = two)

   p1.start()
   p2.start()

Вывод: (Обратите внимание, что интервал ожидания между печатью)

   1
   2

   2
   1

   12

   21

   12

   1
   2

Не уверен, есть ли способ исправить это или вообще это имеет значение. Просто то, что я заметил.

0 голосов
/ 27 июня 2018

Попробуйте это

from threading import Thread

def fun1():
    print("Working1")
def fun2():
    print("Working2")

t1 = Thread(target=fun1)
t2 = Thread(target=fun2)

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