Не может запускать потоки одновременно в 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= Ключевое слово теперь установлено на возвращаемое значение функции. Вы хотите иметь саму функцию. Итак, что на самом деле сейчас происходит:

  1. Вызов Function1()
  2. t1 его цель установлена ​​в None (возвращаемое значение Function1()
  3. 1-2 повторяется для Function2() а также t2,
  4. Начните 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 дает одноядерное переключение контекста, где интерпретатор будет запускать функцию на одном ядре, затем временно ее заменять и запускать другую функцию на одном ядре и т. д. Это, возможно, полезно для приложений, которые что-то делают во время, например, мониторинга пользовательский ввод, но это все.

Другие вопросы по тегам