Я пытаюсь запустить 2 функции одновременно.
def func1():
print 'Working'
def func2():
print 'Working'
func1()
func2()
Кто-нибудь знает, как это сделать?
Я пытаюсь запустить 2 функции одновременно.
def func1():
print 'Working'
def func2():
print 'Working'
func1()
func2()
Кто-нибудь знает, как это сделать?
Сделай это:
from threading import Thread
def func1():
print 'Working'
def func2():
print 'Working'
if __name__ == '__main__':
Thread(target = func1).start()
Thread(target = func2).start()
Ответ на вопрос о потоке хорош, но вам нужно быть более конкретным относительно того, что вы хотите сделать.
Если у вас есть две функции, в которых используются многие процессоры, потоки (в CPython), вероятно, ни к чему не приведут. Тогда вы можете захотеть взглянуть на модуль многопроцессорности или, возможно, вы захотите использовать jython/IronPython.
Если причиной является производительность, связанная с процессором, вы можете даже реализовать вещи в (не-threaded) C и получить гораздо большее ускорение, чем выполнение двух параллельных действий в python.
Без дополнительной информации нелегко найти хороший ответ.
Один вариант, который выглядит так, как будто две функции выполняются одновременно
время, использует модуль threading
(пример в этом ответе).
Тем не менее, он имеет небольшую задержку, как официальная документация Python
страница описывает. Лучший модуль для использования - multiprocessing
.
Также есть и другие модули Python, которые можно использовать для асинхронного выполнения (две части кода работают одновременно). Чтобы получить некоторую информацию о них и помочь выбрать один, вы можете прочитать этот вопрос.
threading
Он мог бы хотеть знать это из-за Глобальной Блокировки Интерпретатора
они не будут выполняться одновременно, даже если машина в
Вопрос имеет несколько процессоров. wiki.python.org/moin/GlobalInterpreterLock
- Йонас Эльфстрем 2 июня 2010 года в 11:39
threading
не работаетДетали реализации CPython: в CPython благодаря глобальному переводчику
Блокировка, только один поток может выполнять код Python одновременно (даже если
некоторые ориентированные на производительность библиотеки могут преодолеть это ограничение).Если вы хотите, чтобы ваше приложение более эффективно использовало вычислительные ресурсы многоядерных машин, рекомендуется использовать multiprocessing или concurrent.futures.ProcessPoolExecutor.
Тем не менее, многопоточность по-прежнему является подходящей моделью, если вы
хотите запустить несколько задач ввода-вывода одновременно.
Я запустил этот код, чтобы проверить, работают ли функции одновременно:
#! /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
Мне кажется, что функции запускаются один за другим...?
Это может быть сделано элегантно с 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 над многопроцессорным модулем или использования многопоточности. В частности, один и тот же код будет работать как на одной машине, так и на кластере машин.
Для получения дополнительных преимуществ Рэй см. Этот пост.
Попробуй это
from threading import Thread
def fun1():
print("Working1")
def fun2():
print("Working2")
t1 = Thread(target=fun1)
t2 = Thread(target=fun2)
t1.start()
t2.start()
Потоковый модуль работает одновременно, в отличие от многопроцессорных, но время немного не работает. Код ниже печатает "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
Не уверен, есть ли способ исправить это, или это имеет значение вообще. Просто то, что я заметил.
Я думаю, что то, что вы пытаетесь передать, может быть достигнуто с помощью многопроцессорной обработки. Однако, если вы хотите сделать это через потоки, вы можете сделать это. Это может помочь
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()