Код: Выделить всё
[
[Client11],
[Client21, Client22],
[Client31]
]
< /code>
Для этой цели я определяю класс, чтобы инкапсулировать связанные задания. Имя класса - clientHandler , и он принимает словарный объект client_dict . Если атрибут «ServerGroup» не является ни одного, он создается несколько объектов MP.Process, и эти объекты передаются в список Self.Process. < /P>
class ClientHandler:
def __init__(self, client_dict):
self.tests = client_dict['Tests']
self.server = client_dict['Server']
self.server_group = client_dict['ServerGroup']
self.process = []
# other necessary initializations from client_dict to members
manager = mp.Manager()
test_list = manager.list(self.tests)
lock = manager.lock()
if self.server is not None:
self.process.append(mp.Process(target=self.process_handle, args=(self.server, test_list, lock))
for server in self.server_group:
self.process.append(mp.Process(target=self.process_handle, args=(server, test_list, lock))
def do_work(self, test, server):
#do work
def process_handle(self, server, test_list, lock):
while True:
with lock:
if not test_list:
break
item = test_list.pop(0)
self.do_work(item, server)
def start(self):
for process in self.process:
process.start()
< /code>
Я попытался решить проблему несколькими методами. Сначала я перенес process_handle () от clientHandler в Global. Затем в конструкторе вместо строк ниже; < /p>
for server in self.server_group:
self.process.append(mp.Process(target=self.process_handle, args=(server, test_list, lock))
< /code>
Я реализовал код ниже. < /p>
for server in self.server_group:
self.process.append(mp.Process(target=process_handle, args=(self, server, test_list, lock))
< /code>
Сделав это, я также обновил процесс_ индле. < /p>
def process_handle(client_handler, server, test_list, lock):
while True:
with lock:
if not test_list:
break
item = test_list.pop(0)
client_handler.do_work(item, server)
< /code>
ничего не изменилось. Согласно предложению SAKIB11 в Python Multiprocessing Module обновляет атрибут класса внутри процесса CALL, но не обновляется во всем мире, я переместил менеджер, TEST_LIST и блокировку объектов на улицу. Таким образом, каждый объект ClientHandler получает эти объекты через аргумент в конструкторе, но та же проблема в одном и том же месте происходит все еще. В этом посте предполагается, что не следует запускать процессы внутри конструктора. И я начинаю не, а создаю объекты процесса в конструкторе, и после этого я начинаю процессы. < /P>
Интересно, где моя вина. Почему я не могу начать параллельные процессы с тем же объектом? Я ценю любую помощь.
Подробнее здесь: https://stackoverflow.com/questions/797 ... -in-python