Лучший, самый безопасный и переносимый способ заставить каждый поток работать с независимыми данными:
import threading
tloc = threading.local()
Теперь каждый поток работает с полностью независимым tloc
объектом, даже если это глобальное имя. Поток может получать и устанавливать атрибуты на tloc
, использовать tloc.__dict__
, если ему нужен словарь и т. Д.
Локальное хранилище для потока исчезает в конце потока; чтобы потоки записывали свои окончательные результаты, пусть они put
свои результаты, прежде чем они завершатся, в общий экземпляр Queue.Queue
(который по своей сути поточно-ориентирован). Аналогично, начальные значения для данных, с которыми должен работать поток, могут быть аргументами, передаваемыми при запуске потока, или могут быть взяты из Queue
.
Другие недоделанные подходы, такие как надежда на то, что операции, выглядящие как атомарные, действительно атомарны, могут работать в определенных случаях в данной версии и выпуске Python, но могут легко сломаться при обновлении или портах. Нет реальной причины рисковать такими проблемами, когда правильная, чистая, безопасная архитектура настолько проста в организации, портативна, удобна и быстра.