Невозможно расколоть ошибку Shabref в многопроцестрой в классе в PythonPython

Программы на Python
Ответить Пред. темаСлед. тема
Anonymous
 Невозможно расколоть ошибку Shabref в многопроцестрой в классе в Python

Сообщение Anonymous »

В проекте, над которым я сейчас работаю, я анализирую файл JSON, и, согласно списку клиентов, мне нужно запустить процессы параллельно. Однако может быть случай, когда внутри списка клиентов я могу начать несколько процессов. Как и в приведенном ниже примере, есть всего четыре процесса, должно быть начато параллельно. < /P>

Код: Выделить всё

[
[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)

В настоящее время ввод программы - «Серверная группа»: ["client11", "client21"] . Таким образом, два процесса создаются и подталкиваются к объекту self.process_list single clienthandler . После строительства одного объекта clientHandler выполняется каждый процесс в self.process_list запускается в функции start () . Но во время выполнения, во второй итерации цикла программа, бросает исключение «не может окрасить" Sleed 'Object "в Process.Start () line.
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
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «Python»