#python #python-3.x #multithreading #subprocess
#python #python-3.x #многопоточность #подпроцесс
Вопрос:
Я пытаюсь запустить цикл с разными ступенями, чтобы ускорить процесс. И я не нахожу другого способа сделать, кроме как создать другой скрипт и вызвать его с помощью subprocess и предоставить ему большой массив в качестве аргумента.. Я прокомментировал код, чтобы объяснить проблему..
сценарий, который я пытаюсь вызвать с помощью подпроцесса:
import multiprocessing
from joblib import Parallel, delayed
import sys
num_cores = multiprocessing.cpu_count()
inputs = sys.argv[1:]
print(inputs)
def evaluate_individual(ind):
ind.evaluate()
ind.already_evaluate = True
if __name__ == "__main__":
# i am trying to execute a loop with multi thread.
# but it need to be in the "__main__" but I can in my main script, so I create an external script...
Parallel(n_jobs=num_cores)(delayed(evaluate_individual)(i) for i in inputs)
сценарий, который вызывает другой сценарий:
import subprocess, sys
from clean import IndividualExamples
# the big array
inputs = []
for i in range(200):
ind = IndividualExamples.simple_individual((None, None), None)
inputs.append(ind)
# and now I need to call this code from another script...
# but as arguments I pass a big array and I don't now if there are a better method
# AND... this don't work to call the subprocess and return no error so I don't now who to do..
subprocess.Popen(['py','C:/Users/alexa/OneDrive/Documents/Programmes/Neronal Network/multi_thread.py', str(inputs)])
спасибо за вашу помощь, если у вас есть другой способ запустить цикл с несколькими потоками в функции (не в основной), скажите мне также.
И извините за мой приблизительный английский.
редактировать: я пробовал с пулом, но та же проблема, мне нужно поместить его в «main«, чтобы я мог поместить его в функцию в моем скрипте (так как мне нужно его использовать)
модифицированный код с пулом:
if __name__ == "__main__":
tps1 = time.time()
with multiprocessing.Pool(12) as p:
outputs = p.map(evaluate_individual, inputs)
tps2 = time.time()
print(tps2 - tps1)
New_array = outputs
Другой маленький вопрос, я пытаюсь с простым циклом и с пулом multiprocess и сравниваю время 2 процесса:
simple loop: 0.022951126098632812
multi thread: 0.9151067733764648
и я делаю это… почему мультипроцесс на 12 ядрах может быть длиннее простого цикла ?
Комментарии:
1. Вы пробовали использовать пул ?
2. нет, это мой первый тест с несколькими процессами
3. да, это работа, но это также необходимо, но в » главном «, но я могу поместить это туда в моем глобальном скрипте. Поэтому я вызываю это с помощью подпроцесса, но это не работает
Ответ №1:
Вы можете сделать это с помощью многопроцессорного пула
import subprocess, sys
from multiprocessing import Pool
from clean import IndividualExamples
def evaluate_individual(ind):
ind.evaluate()
# the big array
pool = Pool()
for i in range(200):
ind = IndividualExamples.simple_individual((None, None), None)
pool.apply_async(func=evaluate_individual, args=(ind,))
pool.close()
pool.join()
Ответ №2:
спасибо, я просто пытаюсь, но это вызывает ошибку во время выполнения:
raise RuntimeError('''
RuntimeError:
An attempt has been made to start a new process before the
current process has finished its bootstrapping phase.
This probably means that you are not using fork to start your
child processes and you have forgotten to use the proper idiom
in the main module:
if __name__ == '__main__':
freeze_support()
...
The "freeze_support()" line can be omitted if the program
is not going to be frozen to produce an executable.