Python 2.7: не удается получить данные очереди во время многопроцессорной обработки - PullRequest
0 голосов
/ 30 января 2019

Запуск python 2.7 на MAC:

У меня есть относительно простая настройка многопроцессорной обработки / очереди, но я не могу получить какие-либо результаты из своей очереди.Dispatcher2 вызывается для многопоточных вызовов к классу Connector (), который принимает команды от Dispatcher, открывает ssh-подключения к устройствам, выполняет диагностические команды, а затем возвращает данные в объект Result ().

class Dispatcher2(object):
def __init__(self):
    self.jobs = []
    self.process_list = list()
    self.jobs_list = list()
    self.result_list = list()

def wrangle(self, cmd_obj):
    logger.debug("wrangling a connection")

    for target in cmd_obj.target_list:
        q = Queue()
        cmd_obj.current_target = target
        p = Process(target=self.connect, args=(cmd_obj, q))
        self.process_list.append(p)
        self.jobs_list.append(q)
        p.start()
    self.close_processes()
    self.process_response(q)

def connect(self, cmd_obj, q):
    c = Connector(cmd_obj)
    result = c.attack()
    print "RECEIVING RESULT %s" %result
    if result:
        q.put(result)
    else:
        return False

def process_response(self, q):
    logger.info("processing response")
    print len(self.jobs_list)
    for job in self.jobs_list:
        try:
            res = job.join()
            print "RESULT is %s" %res
        except Exception as e:
            print "ERROR: %s" %e
            continue

def close_processes(self):
    for process in self.process_list:
        process.join()

Если я вызываю process_response () после закрытия моего списка процессов (как описано выше), я показываю объект Result (), возвращенный из Connector () в функцию connect (), но q.put () выглядит каксбой в connect (), потому что при выполнении process_response ():

  1. self.jobs_list имеет длину 4 элемента (как и ожидалось)
  2. все очереди, добавленные в jobs_list, отсутствуют

Я играл с этим по-разному - я сделал это, не используя список для агрегирования очередей и просто используя 1 очередь, и я попытался вызвать join для процессов, прежде чем пытатьсяget () из очереди и после - кажется, ничего не работает, и я в замешательстве, потому что это довольно простая реализация multiprocessing.

Любая помощь будет принята с благодарностью!Спасибо!

...