тот же нить идент, как это объяснить? - PullRequest
0 голосов
/ 09 мая 2018

мой код здесь, я не могу понять, почему идентификатор потока такой же номер

import threading
from werkzeug.local import Local
import time

l = Local()
l.__storage__


def add_arg(key, value):
l.__setattr__(key, value)
# time.sleep(5)


for i in range(3):
   key = 'arg' + str(i)
   t = threading.Thread(target=add_arg, args=(key, i))
   t.start()
   print(t.ident)
print(l.__storage__)

результат:

123145354104832
123145354104832
123145354104832
{123145354104832: {'arg0': 0, 'arg1': 1, 'arg2': 2}}

Затем я включаю time.sleep(5), тогда результат:

123145311535104
123145316790272
123145322045440
{123145311535104: {'arg0': 0}, 123145316790272: {'arg1': 1}, 123145322045440: {'arg2': 2}}

любой может помочь мне объяснить это

1 Ответ

0 голосов
/ 09 мая 2018

Согласно документации по питону :

Идентификаторы потока могут быть переработаны при выходе из потока и создании другого потока.

Без оператора sleep, add_arg вызывается и завершается до того, как основной поток снова зацикливается. Следовательно, каждый раз, когда вы создаете новый поток Python, он просто использует системный поток (или идентификатор потока) того, который последний раз выполнял предыдущую задачу.

Когда вы добавляете оператор сна, для запуска следующей задачи необходим новый системный поток (и новый идентификатор), поскольку предыдущая задача еще не завершена.

...