Я использую следующий код в Python 3.7, используя Spyder 3.3.2.
Если я запускаю код вручную (ie: в Редакторе Spyder я выбираю импорт библиотеки, нажимая «F9» ", затем я выбираю функцию, которую хочу запустить, и нажимаю" F9 "), она работает.
Но если я нажимаю" Play "на панели инструментов, чтобы запустить файл завершения, он не работает, и я get:
BrokenProcessPool: A process in the process pool was terminated abruptly while the future was running or pending
Мне известно о проблеме в Spyder, и я уже работаю в текущем WD. Я также использовал уловку if __name__ = __main__:
для запуска своей функции как main ().
Код, который я создаю, предназначен для использования людьми, не знакомыми с программированием, поэтому для них это очень безопаснее нажать кнопку «Воспроизвести», чем выбрать и запустить заданный c фрагмент кода.
Вот код, содержание функции которого не вызывает проблем и хорошо паралелизируется при работе, используя 100 % из 8 ядер. Если это помогает, самый большой импортируемый файл - меньше чем 1 МБ.
from concurrent.futures import ProcessPoolExecutor
import pandas as pd
import numpy as np
from MPO_PROC import N_tab, N_tab_FCT, TYPE, TR
from MPO_FUNC import *
def main():
""" Set the variables for the loop """
alpha = 0.05
alg_type = TYPE
futures = []
e = ProcessPoolExecutor(8)
if alg_type == "O":
F = FFR_ME
elif alg_type == "NO":
F = FFR_ME_NO
else :
raise TypeError("Algortithm type selected does not exist. Must be 'O' or 'NO'")
""" Loop over the different task summarized in the tab 'N_tab' during the MPO_PROC step. """
for task in N_tab["TASK_NUMBER"]:
""" Declare variables N, n , f based on the previous calculations """
N = N_tab_FCT.loc[N_tab_FCT["TASK_NUMBER"] == task, "N_Task"]
n = N_tab_FCT.loc[N_tab_FCT["TASK_NUMBER"] == task, "n_i"]
f = N_tab_FCT.loc[N_tab_FCT["TASK_NUMBER"] == task, "F"]
"""" Implement the function using the concurrent.future module for multiprocessing. """
for Ni, ni, fi in zip(N,n,f):
future = e.submit(F, Ni, ni, fi, alpha)
futures.append(future)
results = [ff.result() for ff in futures]
for i in range(len(results)):
f = int(N_tab_FCT.loc[i, "F"])
N_tab_FCT.loc[i,"LBound"] = results[i][0][f]
N_tab_FCT.loc[i,"UBound"] = results[i][1][f]
N_tab_FCT.loc[i,"ME"] = (N_tab_FCT.loc[i,"UBound"] - N_tab_FCT.loc[i,"LBound"])/\
(2*N_tab_FCT.loc[i,"N_Task"])
N_tab_FCT.loc[i,"FFR"] = (N_tab_FCT.loc[i,"LBound"] + (N_tab_FCT.loc[i,"UBound"] - N_tab_FCT.loc[i,"LBound"])/2)/\
N_tab_FCT.loc[i,"N_Task"]
if __name__ == "__main__":
main()
Спасибо.