Подтвердить что ты не робот

Одновременное выполнение двух функций

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

def func1():
    print 'Working'

def func2():
    print 'Working'

func1()
func2()

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

4b9b3361

Ответ 1

Сделай это:

from threading import Thread

def func1():
    print 'Working'

def func2():
    print 'Working'

if __name__ == '__main__':
    Thread(target = func1).start()
    Thread(target = func2).start()

Ответ 2

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

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

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

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

Ответ 3

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

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

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

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

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

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

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

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

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

Ответ 4

Я запустил этот код, чтобы проверить, работают ли функции одновременно:

#! /usr/bin/env python
import threading
from threading import Thread
import time

def time1():
    time.sleep(1)
    print time.time()

def time2():
    time.sleep(1)
    print time.time()   

if __name__ == '__main__':
    Thread(target = time1()).start()
    Thread(target = time2()).start()

Это то, что он возвращает:

+1447425262,16 +1447425263,16

Мне кажется, что функции запускаются один за другим...?

Ответ 5

Это может быть сделано элегантно с 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 над многопроцессорным модулем или использования многопоточности. В частности, один и тот же код будет работать как на одной машине, так и на кластере машин.

Для получения дополнительных преимуществ Рэй см. Этот пост.

Ответ 6

Попробуй это

from threading import Thread

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

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

t1.start()
t2.start()

Ответ 7

Потоковый модуль работает одновременно, в отличие от многопроцессорных, но время немного не работает. Код ниже печатает "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

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

Ответ 8

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

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()