concurrent.futures.as_completed (). ожидает завершения всех потоков и не дает результатов, как и когда поток завершает задачу - PullRequest
0 голосов
/ 30 марта 2020

Я новичок в многопоточности в python, и пока я пытался изучить его с помощью выполняемой задачи, я сталкиваюсь с этой специфической ситуацией, когда приведенный ниже код не работает должным образом (как описано в документах). .

def workerThread()
    data= xyz
    partData.append(data)
    return(partData)

with ThreadPoolExecutor(max_workers=2) as executor:
    results= { executor.submit(workerThread,driver,l): l for l in links_by_letters}

for future in as_completed(results):
    print(future.result())

В соответствии с документами, future.result() должен давать мне partData один за другим, как и когда это доступно из каждого потока, который работает для него. Я использую два потока, как показано в коде для тестирования сейчас. Поведение, которое я наблюдаю при запуске, заключается в том, что partData, который генерируется первым потоком, перезаписывается вторым потоком. Я имею в виду, я получаю два future.results() из двух потоков, и оба этих результата имеют одинаковые данные (перезаписаны).

К вашему сведению: когда я запускаю тестовую программу, чтобы понять поток, я вижу, что он работает как согласно документации.

def workerThread(x):
  print("doing job {}".format(x))
  time.sleep(5)
  JobListList=(21,22,23)

  return x  

def trigger():
  print("starting job 1")
  with ThreadPoolExecutor(max_workers=2) as executor:
     JobList=(1,2,3,4,5)
     results= { executor.submit(workerThread,job): job for job in JobList}

  for future in as_completed(results):
        print(future.result())

Где я ошибаюсь в своем первом упомянутом фрагменте?

...