многопроцессорность в консоли IPython на компьютере Windows – если требование __name_

Я работаю с IPython и Spyder IDE на компьютере под управлением Windows. Когда среда IDE запускается, загружается набор файлов py для определения некоторых функций, которые облегчают мою работу. Все работает так, как ожидалось.

Теперь я хотел бы обновить одну из этих функций, чтобы использовать многопроцессорность, но для Windows это требует инструкции if __name__ == "__main__": Поэтому кажется, что я не могу вызвать функцию напрямую и передать аргументы с консоли IPython.

  • Объединение itertools и многопроцессорности?
  • многопроцессорность вызовов в классе метод Python
  • Ограничение процесса пула многопроцессорности Python
  • RuntimeError для Windows, использующих многопроцессорность python
  • Список добавления для многопроцессорности Python
  • Многопроцессорство запускает слишком много экземпляров Python VM
  • Например, один из 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 обнаруживает USB-накопитель, а затем назначает букву диска?
  • pyHook + pythoncom перестает работать после нажатия слишком большого количества клавиш
  • Как заставить Windows знать о службе, которую я написал на Python?
  • Как открыть окно вывода сценария Python?
  • Обнаружение 64-битной ОС (windows) в Python
  • Список добавления для многопроцессорности Python
  • 2 Solutions collect form web for “многопроцессорность в консоли IPython на компьютере Windows – если требование __name_”

    Итак, я решил эту конкретную проблему.

    1. Поместите определение rand_string в отдельный файл, называемый test2 .
    2. Импортируйте test2 как модуль в мой сценарий test.py

      import test2 as test2

    3. изменить следующую строку для доступа к модулю test2

       processes = [mp.Process(target=test2.rand_string, args=(5, output)) for x in range(4)] 
    4. Запустить test.py

    5. Вызовите myFunction()

    6. Будь счастлив 🙂

    Решение основано на этом многопроцессорном учебнике, в котором предлагается импортировать целевую функцию из другого сценария. Это решение обходит безопасный самостоятельный импорт с помощью 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

    Python - лучший язык программирования в мире.