Пользовательский ввод предотвращает многопроцессорный сегмент кода для работы на окнах - PullRequest
0 голосов
/ 20 сентября 2019

Проблема решается из-за того, что мой многопроцессорный сегмент не работает, когда у меня есть вопрос ввода.

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

import time
from multiprocessing import Pool
import collections

choice = input("Do you wish to start program? \n")
print("hello")
start_time = time.time()
value = collections.namedtuple('value',['vectx','vecty'])
Values = (value(vectx=0,vecty=5),value(vectx=5,vecty=10),value(vectx=10,vecty=15),value(vectx=15,vecty=20))#,value(vectx=200,vecty=300),value(vectx=300,vecty=400),value(vectx=400,vecty=500),value(vectx=500,vecty=600),value(vectx=600,vecty=700),value(vectx=700,vecty=800),value(vectx=800,vecty=900),value(vectx=900,vecty=1000),value(vectx=1000,vecty=1100),value(vectx=1100,vecty=1200))
print("Start")

def Alter(x):
    vectx=x.vectx
    vecty=x.vecty
    Z=(vectx+vecty)
    return(Z)

if choice == "Yes":
    print(1)
    if __name__ == '__main__':    
        with Pool(10) as p:
            result=p.map(Alter, Values)
        new = []
        print("end")
        print("result Done")
        for i in result:
                new.append(i)

        print( "My program took " +str(time.time() - start_time)+ " to run")

Ожидаемый результат - программа завершена.

1 Ответ

0 голосов
/ 20 сентября 2019

Ваша проблема в том, что в Windows нет fork, как у машин на базе Unix.Таким образом, каждый процесс пула, работающий в Windows , импортирует основной файл при создании.

Итак, что происходит в вашей программе, так это то, что каждый новый процесс запрашивает ввод, и ваши программы сталкиваются с самим собой.Мне было немного неясно, где находится if __name__ == '__main__':, но суть здесь в том, что вам нужно сохранить все, что нужно для запуска.Оставьте вне этого только важные вещи, которые разделяют все процессыНапример, рабочий код на окнах может быть:

import time
from multiprocessing import Pool
import collections

def Alter(x):
    vectx = x.vectx
    vecty = x.vecty
    Z = (vectx + vecty)
    return Z

value = collections.namedtuple('value', ['vectx', 'vecty'])

if __name__ == '__main__':  
    choice = input("Do you wish to start program? \n")
    Values = (value(vectx=0,vecty=5),value(vectx=5,vecty=10),value(vectx=10,vecty=15))
    if choice == "Yes":
        print("Start")
        start_time = time.time()
        with Pool(10) as p:
            result = p.map(Alter, Values)
         print("My program took " + str(time.time() - start_time) + " to run")

Дает:

Do you wish to start program? 
Yes
Start
My program took 1.9328622817993164 to run

Из документов , в соответствии с руководящими принципами программирования, раздел Безопасный импорт основного модуля :

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

...