多处理打印语句在 Spyder 中不起作用 IDE

Multiprocessing print statement doesn't work in Spyder IDE

在机器 运行 Windows Server 2012 R2 中,在来自 Anaconda 的 Spyder IDE 和 运行 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!')

我得到了输出

name is main

Program completed in 0.13s

Goodbye!

我的期望是我会看到两个打印语句

func start

func end

而且(因为调用了 .join)程序需要 >1 秒才能完成。

我怀疑 .start() 调用没有成功调用 do_something 函数。

仅供参考,我正在关注 this tutorial, which I know needs to be modified to include the if statement on windows. I am also seeing similar code on other sites,但似乎对我不起作用。

如有任何故障排除建议,我们将不胜感激。

**编辑:根据下面来自 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!')

当我 运行 你的代码时,我得到以下输出。你能在另一个 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!