Вы не можете использовать threading.Lock
для многопроцессорной обработки, вам нужно использовать multiprocessing.Lock
.
Вы получаете ошибку засоления, потому что threading.Lock
не может быть засолен, и вы находитесь на ОС, которая по умолчанию использует «spawn» для запуска новых процессов (Windows или macOS с Python 3.8 +).
Обратите внимание, что на разветвленной ОС (Linux, BSD ...), при использовании threading.Lock
вы не получите ошибку травления, но блокировка будет реплицирована без предупреждения, не обеспечив синхронизацию между процессами , которые вы намеревались.
Использование отдельной функции для настройки блокировка возможна, но я бы предпочел передать ее в качестве аргумента Process.__init__()
вместе с другими возможными аргументами.
import time
from multiprocessing import Process, Lock, current_process
class MyProcess(Process):
def __init__(self, lock, name=None, args=(), kwargs={}, daemon=None):
super().__init__(
group=None, name=name, args=args, kwargs=kwargs, daemon=daemon
)
# `args` and `kwargs` are stored as `self._args` and `self._kwargs`
self.lock = lock
def run(self) :
with self.lock :
for i in range(3):
print(current_process().name, *self._args)
time.sleep(1)
if __name__ == '__main__' :
lock = Lock()
p1 = MyProcess(lock=lock, args=("hello",))
p2 = MyProcess(lock=lock, args=("world",))
p1.start()
p2.start()
p1.join() # don't forget joining to prevent parent from exiting too soon.
p2.join()
Вывод:
MyProcess-1 hello
MyProcess-1 hello
MyProcess-1 hello
MyProcess-2 world
MyProcess-2 world
MyProcess-2 world
Process finished with exit code 0