У меня есть этот код, который по идее должен работать нормально. Однако он заходит в тупик, и я не могу понять, почему. Я пытаюсь поделиться объектом класса и синхронизировать доступ к его членам из процессов.
Поэтому я подумал, что включение объектов синхронизации внутри класса будет работать, но это не сработало.
Как я могу это реализовать?
Вот мой текущий код:
from multiprocessing import Process, Condition, Lock
from multiprocessing import freeze_support
from multiprocessing.managers import BaseManager, AcquirerProxy
import time, os
# lock = Lock()
# waitC = Condition(lock)
# waitP = Condition(lock)
class info(object):
def __init__(self):
self.nl = []
self.lock = Lock()
self.waitC = Condition(self.lock)
self.waitP = Condition(self.lock)
# self.lock.acquire()
# self.waitP.notify()
# self.lock.release()
def getLen(self):
return len(self.nl)
def stampa(self):
self.lock.acquire()
# print(24)
self.waitC.wait()
print (self.nl)
self.waitP.notify()
self.lock.release()
def appendi(self, x):
self.lock.acquire()
self.waitP.wait()
print(36)
if x is list:
for new_value in x:
self.nl.append(new_value)
else:
self.nl.append(x)
self.waitC.notify()
self.lock.release()
def svuota(self):
for i in range(len(self.nl)):
del self.nl[0]
class numManager(BaseManager):
pass
numManager.register('info', info, exposed = ['getLen', 'appendi', 'svuota', 'stampa'])
# numManager.register('lock', lock, AcquirerProxy)
# numManager.register('waitP', waitP, AcquirerProxy)
# numManager.register('waitC', waitC, AcquirerProxy)
def consume(listaNumeri):
print(53)
listaNumeri.stampa()
listaNumeri.svuota()
# print(55)
# time.sleep(1.1)
# listaNumeri.stampa()
# listaNumeri.svuota()
def produce(listaNumeri):
times = 0
while times<4:
insert = []
for i in range(10):
insert.append(i)
print(63)
listaNumeri.appendi(insert)
time.sleep(1)
insert = []
for i in range(7):
insert.append(i*(-1))
listaNumeri.appendi(insert)
times = times+1
def main():
mymanager = numManager()
mymanager.start()
info = mymanager.info()
producer = Process(target = produce, args =(info,))
producer.start()
time.sleep(2)
consumer = Process(target = consume, args =(info,))
consumer.start()
consumer.join()
print("consumer finished")
producer.join()
if __name__ == '__main__':
freeze_support()
main()
Я специально оставил закомментированный код, чтобы вы могли увидеть мой шаблон мышления и указать на любые ошибки.