Эти потоки работают параллельно? - PullRequest
0 голосов
/ 26 мая 2020

У меня есть следующий код:

from threading import Thread
from threading import currentThread


def f(i, name="default"):
    print("Thread named {} with id={} is working".format(name, i))


for i in range(3):
    Thread(target=f, args=(i,), kwargs={"name": "%s" % currentThread().getName()}).start()

Это результат, который я получаю:

>> Thread named MainThread with id=0 is working
>> Thread named MainThread with id=1 is working
>> Thread named MainThread with id=2 is working

если эти три потока работают параллельно, почему все они имеют одинаковое имя , если они не работают параллельно, как я могу изменить свой код, чтобы они работали параллельно?

Ответы [ 2 ]

4 голосов
/ 26 мая 2020

Значение аргумента kwargs={"name": "%s" % currentThread().getName()} вычисляется одновременно с вызовом Thread (точнее, непосредственно перед ним). Таким образом, каждый поток получает аргумент ключевого слова name="MainThread", переданный функции, которую он должен выполнять.

Попробуйте вызвать currentThread() внутри f, например:

def f(i):
    print("Thread named {} with id={} is working".format(currentThread().getName(), i)
1 голос
/ 26 мая 2020

если эти три потока работают параллельно, почему все они имеют одно и то же имя

Это потому, что ваш currentThread().getName() вызывается в потоке, порождающем их, поэтому он передает имя этого потока для всех созданных.

, если они не работают параллельно, как я могу изменить свой код, чтобы они работали параллельно?

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...