многопроцессорность в консоли IPython на компьютере Windows – если требование __name_
Я работаю с IPython и Spyder IDE на компьютере под управлением Windows. Когда среда IDE запускается, загружается набор файлов py для определения некоторых функций, которые облегчают мою работу. Все работает так, как ожидалось.
Теперь я хотел бы обновить одну из этих функций, чтобы использовать многопроцессорность, но для Windows это требует инструкции if __name__ == "__main__":
Поэтому кажется, что я не могу вызвать функцию напрямую и передать аргументы с консоли IPython.
Например, один из py-файлов (назовем его test.py) может выглядеть следующим образом.
import multiprocessing as mp import random import string # define a example function def rand_string(length, output): """ Generates a random string of numbers, lower- and uppercase chars. """ rand_str = ''.join(random.choice( string.ascii_lowercase + string.ascii_uppercase + string.digits) for i in range(length)) output.put(rand_str) def myFunction(): # Define an output queue output = mp.Queue() # Setup a list of processes that we want to run processes = [mp.Process(target=rand_string, args=(5, output)) for x in range(4)] # Run processes for p in processes: p.start() # Exit the completed processes for p in processes: p.join() # Get process results from the output queue results = [output.get() for p in processes] print(results)
В моей консоли IPython я хотел бы использовать строку
myFunction()
для запуска всех вычислений. Но в Windows в итоге возникает ошибка BrokenPipe.
Когда я
if __name__ == "__main__": myFunction()
в конце файла py и запустите полный файл
runfile(test.py)
оно работает. Конечно. Но это очень сложно передать аргументы функции, поскольку мне всегда приходится редактировать сам файл test.py.
Мой вопрос: как я могу запустить многопроцессорную функцию, не помещая ее в это, if __name__ == "__main__":
statement ??
- Список добавления для многопроцессорности Python
- параллельное вычисление comb_with_replacement с использованием многопроцессорной обработки
- Ошибка с параметром настройки для класса Python, унаследованного от многопроцессорности. Процесс
- Python Shared Memory Array, без атрибута get_obj ()
- многопроцессорность и сокеты. Как подождать?
Итак, я решил эту конкретную проблему.
- Поместите определение
rand_string
в отдельный файл, называемыйtest2
. -
Импортируйте
test2
как модуль в мой сценарийtest.py
import test2 as test2
-
изменить следующую строку для доступа к модулю
test2
processes = [mp.Process(target=test2.rand_string, args=(5, output)) for x in range(4)]
-
Запустить
test.py
-
Вызовите
myFunction()
-
Будь счастлив 🙂
Решение основано на этом многопроцессорном учебнике, в котором предлагается импортировать целевую функцию из другого сценария. Это решение обходит безопасный самостоятельный импорт с помощью if __name__
-wrapper, чтобы получить доступ к целевой функции.
multiprocessing
не работает без выполнения, if __name__ == '__main__'
.
Однако вы можете использовать вилку multiprocessing
которая по существу использует dill
для обработки сеанса интерпретатора в виде файла … (словом, он работает).
Python 2.7.9 (default, Dec 11 2014, 01:21:43) Type "copyright", "credits" or "license" for more information. IPython 3.0.0 -- An enhanced Interactive Python. ? -> Introduction and overview of IPython's features. %quickref -> Quick reference. help -> Python's own help system. object? -> Details about 'object', use 'object??' for extra details. In [1]: from pathos.multiprocessing import ProcessingPool as Pool In [2]: def squared(x): ...: return x**2 ...: In [3]: x = range(10) In [4]: p = Pool() In [5]: p.map(squared, x) Out[5]: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] In [6]: res = p.imap(squared, x) In [7]: list(res) Out[7]: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81] In [8]:
Вы можете использовать встроенную multiprocessing
которая также была дополнена сериализатором dill
, или вы можете построить Queue
с Pool().apipe
, любой из которых больше похож на то, что вам кажется интересным делать с Queue
.
Получить пафос здесь: https://github.com/uqfoundation
- Как найти все элементы в двумерном массиве numpy, который соответствует определенному списку?
- Django Получить последнюю запись из базы данных
- Python не может запустить Process с Process.start () в Windows. Сигналы PySide
- Оптимизируйте этот код анализа паролей python
- многопроцессорный питон
- Можно ли использовать объекты сокета при многопроцессорности Python? socket.close (), похоже, не работает
- Многопроцессорная обработка Windows
- Установить значение строки в совместно используемом c_wchar_p в подпроцессе?
- Python: многопроцессорность и массив c_char_p
- Многопроцессорность Python и сокеты не закрываются
- Объединение itertools и многопроцессорности?