Как НЕ ждать окончания потока в Python - PullRequest
0 голосов
/ 25 июня 2018

В этом вопросе он действительно спросил что-то вроде того, что я хочу.За исключением того, что ответ был убрать скобки.Однако, если я уберу скобки, я не смогу передавать аргументы для своих функций.

Как я могу выполнить следующий простой код без ожидания:

from time import sleep
import threading

def whatever(i):
  sleep(5)
  print("Hey! It's me number " + str(i))

for i in range(3):
  t = threading.Thread(target=whatever(i))
  t.start()

Желаемый вывод будетбыть

Hey! It's me number 0
Hey! It's me number 1
Hey! It's me number 2

Все напечатано одновременно

Ответы [ 4 ]

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

Просто заверните его в лямбду.

from time import sleep
import threading

def whatever(i):
  sleep(5)
  print("Hey! It's me number " + str(i))

for i in range(3):
  t = threading.Thread(target=lambda: whatever(i))
  t.start()
0 голосов
/ 25 июня 2018
from time import sleep
import threading

def whatever(i):
  print("Hey! It's me number " + str(i))

for i in range(3):
  t = threading.Thread(target=whatever, args=(i,))
  t.start()

Вы должны учитывать одну вещь.

В Python есть нечто, называемое GIL - Global Interpreter Lock.Короче говоря, это то, что позволяет только одному потоку вашего приложения на Python одновременно выполняться в данном интерпретаторе.Что это значит?

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

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

вы, похоже, не понимаете, что делает эта строка: t = threading.Thread(target=whatever(i)), удаление скобок не означает просто не ждать, пока поток завершит свою работу, так что вы можете запустить функцию в отдельном потоке:

target должен быть самим объектом функции, но когда вы делаете t = threading.Thread(target=whatever(1)), target будет возвращать значение whatever, которое вы уже выполнили в исходном потоке, вам нужно датьthreading сама функция затем определяет параметры отдельно, и она будет вызывать ее для вас так:

from time import sleep
import threading

def whatever(i):
  sleep(5)
  print("Hey! It's me number " + str(i))

for i in range(3):
  t = threading.Thread(target=whatever, args=(i,))
  t.start()
0 голосов
/ 25 июня 2018

Из документации , target должен быть вызываемым:

target - это вызываемый объект, который вызывается методом run ()

Вы не передаете свою функцию в target, вы передаете возвращаемое значение своей функции, поэтому функция запускается, как только вы передаете ее в threading.Thread, а не при вызове t.start().

Вы должны использовать параметр args для указания аргументов для вашего вызываемого объекта.

Просто измените эту строку:

 t = threading.Thread(target=whatever(i))

на

t = threading.Thread(target=whatever, args=(i,))
...