Как передать список в качестве параметра в параллельном процессе, используя concurrent.futures - PullRequest
0 голосов
/ 03 декабря 2018

У меня есть следующие коды.В принципе, я бы хотел выполнить итерацию long_list и применить функцию procedure(), которая принимает значение и другой список short_list в качестве параметра:

def procedure(par1, the_short_list):
    """
    Description of procedure
    """
    o1, o2 = par1.split(" ")
    out = []
    for sl in the_short_list:
        output = sl * int(o1) * int(o2)
        out.append(output)
    return out



long_list = [str(v) + " " + str(w) for v, w in enumerate(range(0,10))]
short_list = range(10,15)

#--------------------------------------------------
# Sequential
#--------------------------------------------------
for i in long_list:
    out = procedure(i, short_list)
    print  (out)

. Получает такой результат:

[0, 0, 0, 0, 0]
[10, 11, 12, 13, 14]
[40, 44, 48, 52, 56]
[90, 99, 108, 117, 126]
[160, 176, 192, 208, 224]
[250, 275, 300, 325, 350]
[360, 396, 432, 468, 504]
[490, 539, 588, 637, 686]
[640, 704, 768, 832, 896]
[810, 891, 972, 1053, 1134]

Теперь я хочу распараллелить процесс, разбив long_list, запустить procedure() параллельно и, наконец, собрать результаты.

Я попробовал этот код:

#--------------------------------------------------
# Parallel
#--------------------------------------------------
import concurrent.futures
with concurrent.futures.ThreadPoolExecutor(max_workers=5) as executor:
    future = executor.submit(procedure, long_list, short_list)
    print(future.result())

Но это выдает эту ошибку.

Traceback (most recent call last):
  File "test.py", line 33, in <module>
    print(future.result())
  File "/home/ubuntu/anaconda2/lib/python2.7/site-packages/concurrent/futures/_base.py", line 462, in result
    return self.__get_result()
  File "/home/ubuntu/anaconda2/lib/python2.7/site-packages/concurrent/futures/thread.py", line 63, in run
    result = self.fn(*self.args, **self.kwargs)
  File "test.py", line 6, in procedure
    o1, o2 = par1.split(" ")
AttributeError: 'list' object has no attribute 'split'

Какой правильный способ сделать это?

Я ожидаю, что выход будет таким же, как в последовательной версии.И когда применить с гораздо большим long_list он будет работать быстрее.

1 Ответ

0 голосов
/ 03 декабря 2018

Это должно работать для вас:

import concurrent.futures

futures = []
with concurrent.futures.ThreadPoolExecutor() as executor:
    for entry in long_list: 
         futures.append(executor.submit(procedure, entry, short_list))
for future in futures:
    print(future.result())
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...