Python многопроцессорность с пулом и менеджером контекста - PullRequest
1 голос
/ 11 июля 2020

Я относительно новичок в Python и новичок в Python многопроцессорной обработке. Я пытаюсь выполнить функцию несколько раз (10 раз в примере ниже) как отдельные процессы. Внутри функции у меня есть al oop нескольких итераций (опять же, 10 раз в примере ниже). В этом примере, для простоты, функция просто устанавливает случайное число. Судя по добавленным мной логам, у меня как минимум две проблемы. Во-первых, хотя я вижу запуск итерации 1 каждого экземпляра процесса и установку случайного числа, итерация 2 каждого экземпляра процесса запускается, но, похоже, ничего не делает сверх этого, и итерации 3-10 каждого процесса, похоже, вообще не запускаются. Во-вторых, похоже, что существует перекрестное заражение между экземплярами процессов, причем несколько процессов, по-видимому, устанавливают одно и то же случайное число.

Мой код

import concurrent.futures
import numpy as np

def do_it(n):
    for i in range(1,11):
        print("do_it instance" + " " + str(n) + ", iteration " + str(i) + " starting")
        try:
            rnd
        except NameError:
            print("do_it instance" + " " + str(n) + ", iteration " + str(i) + ": Variable is not defined")
        else:
            print("do_it instance" + " " + str(n) + ", iteration " + str(i)+ ": Variable is already defined as " + str(random))
        rnd = np.random.randint(1,1000)
        print("do_it instance" + " " + str(n) + ", iteration " + str(i) + ": rnd set to " + str(rnd))
        return rnd
def main():

    with concurrent.futures.ProcessPoolExecutor() as executor:
        results = executor.map(do_it, range(1,11))
    print(results)

Моя цель - в итоге получается список из 100 случайных чисел, по одному от каждого из 10 экземпляров процесса и 10 итераций в нем. Несомненно, у этого есть простое объяснение и решение, но поиск ответов в Интернете мне не помог. Есть ли Python специалисты, которые могут помочь?

Журнал

do_it instance 1, iteration 1 starting
do_it instance 1, iteration 1: Variable is not defined
do_it instance 2, iteration 1 starting
do_it instance 2, iteration 1: Variable is not defined
do_it instance 3, iteration 1 starting
do_it instance 3, iteration 1: Variable is not defined
do_it instance 1, iteration 1: rnd set to 807
do_it instance 1, iteration 2 starting
do_it instance 2, iteration 1: rnd set to 807
do_it instance 2, iteration 2 starting
do_it instance 3, iteration 1: rnd set to 807
do_it instance 3, iteration 2 starting
do_it instance 4, iteration 1 starting
do_it instance 4, iteration 1: Variable is not defined
do_it instance 4, iteration 1: rnd set to 666
do_it instance 4, iteration 2 starting
do_it instance 5, iteration 1 starting
do_it instance 5, iteration 1: Variable is not defined
do_it instance 5, iteration 1: rnd set to 666
do_it instance 5, iteration 2 starting
do_it instance 6, iteration 1 starting
do_it instance 6, iteration 1: Variable is not defined
do_it instance 6, iteration 1: rnd set to 807
do_it instance 6, iteration 2 starting
do_it instance 7, iteration 1 starting
do_it instance 8, iteration 1 startingdo_it instance 7, iteration 1: Variable is not defined

do_it instance 8, iteration 1: Variable is not defined
do_it instance 8, iteration 1: rnd set to 666
do_it instance 8, iteration 2 startingdo_it instance 7, iteration 1: rnd set to 666

do_it instance 9, iteration 1 startingdo_it instance 7, iteration 2 starting

do_it instance 9, iteration 1: Variable is not defined
do_it instance 10, iteration 1 startingdo_it instance 9, iteration 1: rnd set to 947

do_it instance 9, iteration 2 startingdo_it instance 10, iteration 1: Variable is not defined

do_it instance 10, iteration 1: rnd set to 947
do_it instance 10, iteration 2 starting
...