#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
или что-то в этом роде.