Многопроцессорная обработка Python не работает в Spyder IDE - PullRequest
0 голосов
/ 23 февраля 2020

На машине под управлением Windows Server 2012 R2, в IDE Spyder от Anaconda и под управлением Python 3.7 со следующим кодом:

import time
import multiprocessing

start=time.perf_counter()

def do_something():
    print('func start')
    time.sleep(1)
    print('func end')

if __name__=='__main__':
    print('name is main')
    p1=multiprocessing.Process(target=do_something)
    p1.start()
    p1.join()

finish=time.perf_counter()

print('\n\nProgram completed in '+str(round((finish-start),2))+'s')
print('Goodbye!')

И я получаю вывод

имя является основным

Программа выполнена за 0,13 с

До свидания!

Я ожидал, что увижу два оператора печати

веселье c начало

веселье c конец

, а также (потому что .join был вызван), что для выполнения программы потребуется> 1 с.

Я подозреваю, что вызов .start () не успешно вызвал функцию do_something.

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

Буду весьма признателен за любые предложения по устранению неполадок.

** РЕДАКТИРОВАТЬ: Согласно комментарию ниже от Azy_Crw4282, код, кажется, работает на его конце и, по его предложению, кажется, работает из командной строки cmd. Так что, похоже, это ошибка именно в Spyder IDE.

К вашему сведению, я хотел понять, была ли проблема в том, что процесс запускался, но IDE не захватывал выходные данные ИЛИ процесс не запускался. Я попробовал две вещи: 1) код ниже записывает фрейм данных в csv. Делая это в многопроцессорной функции, он НЕ записывает файл. 2) Я создал глобальную переменную и изменил значение переменной в функции. Spyder сохраняет значения переменных после выполнения кода, и когда я напечатал переменную, она не изменилась.

Итак, в итоге - кажется, что Spyder IDE не работает с модулем многопроцессорной обработки. **

import time
import multiprocessing

start=time.perf_counter()

df=pd.DataFrame(data={'Col1':[1.1,2.1,3.1],
    'Col2':[1.2,2.2,3.2],
    'Col3':[1.3,2.3,3.3]}, columns=['Col1','Col2','Col3'])

def do_something():
    print('func start')
    df.to_csv('C:/testMp.csv')
    time.sleep(1)
    print('func end')



if __name__=='__main__':
    print('name is main')
    p1=multiprocessing.Process(target=do_something)
    p1.start()    
    p1.join()

    finish=time.perf_counter()

    print('\n\nProgram completed in '+str(round((finish-start),2))+'s')
    print('Goodbye!')

1 Ответ

0 голосов
/ 23 февраля 2020

Когда я запускаю ваш код, я получаю следующий вывод. Можете ли вы попробовать запустить свой код в другой линии ide / cmd / терминале?

import multiprocessing

start=time.perf_counter()

def do_something():
    print('func start')
    time.sleep(1)
    print('func end')

if __name__=='__main__':
    print('name is main')
    p1=multiprocessing.Process(target=do_something)
    p1.start()
    p1.join()

finish=time.perf_counter()

print('\n\nProgram completed in '+str(round((finish-start),2))+'s')
print('Goodbye!')

Выходы:

name is main


Program completed in 0.0s
Goodbye!
func start
func end


Program completed in 1.27s
Goodbye!

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

import time
import multiprocessing

start=time.perf_counter()

def do_something():
    print('func start')
    time.sleep(1)
    print('func end')

if __name__=='__main__':
    print('name is main')
    p1=multiprocessing.Process(target=do_something)
    p1.start()
    p1.join()

    finish=time.perf_counter()

    print('\n\nProgram completed in '+str(round((finish-start),2))+'s')
    print('Goodbye!')

Выходы:

name is main
func start
func end


Program completed in 1.33s
Goodbye!
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...