Не может запускать потоки одновременно в python
from threading import Thread
import time
def Function1():
print "11"
print "12"
time.sleep(5)
print "13"
print "14"
def Function2():
print "21"
print "22"
time.sleep(10)
print "23"
print "24"
for i in range(3)
t1= Thread(target=Function1())
t2= Thread(target=Function2())
t1.start()
t2.start()
Выше программа работает последовательно...
11
12
13
14
21
22
23
24
11
12
13
14
21
22
23
24
11
12
13
14
21
22
23
24
как запустить две функции (потоки) одновременно?? Я не хочу использовать многопроцессорность.. Мне нужно написать скрипт Python для тестирования производительности... для этого мне нужны потоки для одновременного запуска Есть ли способ решить эту проблему?
2 ответа
Ваша проблема в том, что target=
Ключевое слово теперь установлено на возвращаемое значение функции. Вы хотите иметь саму функцию. Итак, что на самом деле сейчас происходит:
- Вызов
Function1()
t1
его цель установлена вNone
(возвращаемое значениеFunction1()
- 1-2 повторяется для
Function2()
а такжеt2
, - Начните
t1
а такжеt2
темы, которые оба имеютNone
как цель. Это не имеет никакого эффекта.
замещать
t1= Thread(target=Function1())
t2= Thread(target=Function2())
с
t1= Thread(target=Function1)
t2= Thread(target=Function2)
Если вы хотите параллельное выполнение кода Python на нескольких ядрах, то ваша единственная надежда multiprocessing
, Поскольку, как упоминалось в другом ответе, интерпретатор CPython позволяет одновременно выполнять только один фрагмент кода Python (см. "Глобальная блокировка интерпретатора"). В Интернете можно найти много информации об этом.
Как запустить две функции (потоки) одновременно? Я не хочу использовать многопроцессорность..
К сожалению, вы не можете иметь эти два одновременно (или, по крайней мере, вы не можете запускать вещи по-настоящему одновременно, используя threading
). Это неотъемлемое ограничение GIL интерпретатора CPython.
Единственное что threading
дает одноядерное переключение контекста, где интерпретатор будет запускать функцию на одном ядре, затем временно ее заменять и запускать другую функцию на одном ядре и т. д. Это, возможно, полезно для приложений, которые что-то делают во время, например, мониторинга пользовательский ввод, но это все.