Python 3 concurrent.futures - процесс для l oop параллельно - PullRequest
0 голосов
/ 19 апреля 2020

Если я правильно понял, как работает модуль concurrent.futures в Python 3, следующий код:

import concurrent.futures
import threading

# Simple function returning a value
def test(i):

    a = 'Hello World\n'
    return a


def main():
    output1 = list()

    with concurrent.futures.ThreadPoolExecutor() as executor:

        # psdd iterator to test function
        for out1 in executor.map(test, range(0, 10)):
            # append returned result
            output1.append(out1)

            # confirm output
            print(output1)
            print("Task Executed {}".format(threading.current_thread()))


if __name__ == '__main__':
    main()

... выполняет следующие функции:

  1. Передает для l oop в функцию, называемую test().
  2. Обрабатывает l oop параллельно, а не последовательно.

Однако, что я на самом деле Я хочу обработать l oop параллельно в моей функции main() следующим образом:

import concurrent.futures
import threading


def main():
    output1 = list()

    with concurrent.futures.ThreadPoolExecutor() as executor:

        # psdd iterator to test function
        for out1 in executor.submit(range(0, 10)):

            a = 'Hello World\n'
            # append returned result
            output1.append(a)

            # confirm output
            print(output1)
            print("Task Executed {}".format(threading.current_thread()))


if __name__ == '__main__':
    main()

... но это приводит к следующей ошибке:

Traceback (most recent call last):
  File "G:\HTPC Scripts\WebGrab Plus\TESTTESTTEST2.py", line 221, in <module>
    main()
  File "G:\HTPC Scripts\WebGrab Plus\TESTTESTTEST2.py", line 209, in main
    for out1 in executor.submit(range(0, 10)):
TypeError: 'Future' object is not iterable

Что делать Мне нужно изменить код?

Спасибо

1 Ответ

1 голос
/ 19 апреля 2020

Неважно, используете ли вы submit или map, вы всегда должны использовать вызываемый (например, функцию) в качестве первого аргумента.

Python разрешает вложенные функции (также обратите внимание на способ использования Futures);

import concurrent.futures


def main():

    def worker(arg):
        return str(arg) + ' Hello World!'

    with concurrent.futures.ThreadPoolExecutor() as e:
        fut = [e.submit(worker, i) for i in range(10)]
        for r in concurrent.futures.as_completed(fut):
            print(r.result())


if __name__ == '__main__':
    main()

Единственный способ определить вызываемый на месте - это выражение lambda, но они имеют значительные ограничения.

...