Python и FreeBSD: threading.currentThread().ident возвращает одно и то же значение даже в разных процессах

#python #multithreading #freebsd

#python #многопоточность #freebsd

Вопрос:

Как следует из названия, разные вызовы threading.currentThread().ident возвращают 34382823872 даже в разных процессах. (С использованием Python 3.1 и FreeBSD)

Проблема FreeBSD с потоками python или нет?

Комментарии:

1. На Mac я получаю -1601345760 для разных процессов. Почему вы думаете, что это проблема?

Ответ №1:

Вы тестируете это в REPL? Или в реальной программе? Я спрашиваю, потому что, когда я запускал приведенное ниже с помощью REPL, я получил тот же результат, но когда я запускал то же самое как скрипт, потоки имели разные идентификаторы.

 import threading

def thid():
    print threading.currentThread().ident

t1 = threading.Thread(target=thid)
t2 = threading.Thread(target=thid)
t1.start()
t2.start()
t1.join()
t2.join()
  

Вывод REPL:

 >>> t1.start()
4301111296
>>> t2.start()
4301111296
  

Вывод скрипта:

 me@mine:~ $ python th.py 
4300935168
4302835712
  

Я подозреваю, что это ожидаемое поведение; приведенное ниже взято из threading документов:

‘Идентификатор потока’ этого потока или Нет, если поток не был запущен. Это ненулевое целое число. Смотрите функцию thread.get_ident(). Идентификаторы потоков могут быть переработаны при завершении потока и создании другого потока.

Кроме того, я изменил thid в REPL следующим образом:

 >>> def thid():
...     print threading.currentThread().ident
...     sleep(10)
  

И когда я вызывал t2.start() в течение 10 секунд после вызова t1.start() , у них были разные идентификаторы, но если я ждал более 10 секунд, у них был один и тот же идентификатор.

Если вы хотите различать разные потоки, просто вызовите id(threading.currentThread()) . Идентификаторы Python всегда различны.

Комментарии:

1. На самом деле я использую Apache mod_wsgi.

2. Хорошо, что ж, вполне могут быть справедливы те же рассуждения. Завершается ли первый поток перед вызовом второго?

3. Возможно! Я использовал идентификатор потока для идентификации разных потоков, но, похоже, это не самый лучший способ. Как я могу различать разные потоки?!

4. Смотрите правку внизу моего ответа. Thread Объекты, возвращаемые currentThread , по-прежнему различны, поэтому вы можете использовать id или что-то в этом роде.