Вам необходимо реализовать собственную блокировку для всех общих переменных, которые будут изменены в Python. Вам не нужно беспокоиться о чтении из переменных, которые не будут изменены (т. Е. Одновременное чтение нормально), поэтому неизменяемые типы (frozenset
, tuple
, str
): , вероятно, * 1005. * безопасно, но это не повредит. Для вещей, которые вы собираетесь изменять - list
, set
, dict
и большинство других объектов, у вас должен быть свой собственный механизм блокировки (хотя операции на месте в большинстве из них работают нормально, потоки могут вести к очень неприятным ошибкам - вы могли бы также реализовать блокировку, это довольно легко).
Кстати, я не знаю, знаете ли вы это, но блокировка очень проста в Python - создайте объект threading.lock, а затем вы можете получить / освободить его так:
import threading
list1Lock = threading.Lock()
with list1Lock:
# change or read from the list here
# continue doing other stuff (the lock is released when you leave the with block)
В Python 2.5 выполните from __future__ import with_statement
; В Python 2.4 и более ранних версиях его нет, поэтому вы захотите поместить вызовы acqu () / release () в блоки try:...finally:
:
import threading
list1Lock = threading.Lock()
try:
list1Lock.acquire()
# change or read from the list here
finally:
list1Lock.release()
# continue doing other stuff (the lock is released when you leave the with block)
Немного полезной информации о синхронизации потоков в Python .