【问题标题】:Multiprocessing print statement doesn't work in Spyder IDE多处理打印语句在 Spyder IDE 中不起作用
【发布时间】:2020-06-07 12:27:29
【问题描述】:

在运行 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!')

我得到了输出

名字是主要的

程序在0.13s内完成

再见!

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

函数开始

函数结束

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

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

仅供参考,我正在关注this tutorial,我知道需要对其进行修改以在 Windows 上包含 if 语句。我也看到了类似的代码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!')

【问题讨论】:

  • 我无法用显示的代码复制问题。
  • 观察 - 无法在 PyCrust(wx REPL)中运行它,但它在 PyDev/Eclipse 中完美运行。也从 OS bash shell 运行。
  • 这让我想起了我有一个使用子解释器的项目。大多数模块在这种情况下工作正常,但有些模块在加载时不能正常工作。我认为像 PyCrust 这样的 Python 控制台应用程序可能会使用子解释器(有些则不会)。这可以解释为什么多处理模块在不同的 shell 环境中表现不同。
  • 这将发生在默认多处理启动方法为“spawn”的任何 IDE 中,并且 IDE 使用 STDOUT 重定向将 python 实例集成到其 gui 中。默认情况下,Windows 上的 Spyder 正是这样做的,但可以通过“首选项 > 运行 > 在系统终端中执行”轻松更改为使用外部系统终端

标签: python python-3.x python-multiprocessing


【解决方案1】:

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

【讨论】:

  • 谢谢阿兹。从 cmd 提示符中,我得到了您列出的结果。我猜这是Spyder中的错误??还赞成您的回复,但我没有足够的代表来更改您的帖子分数。再次感谢。
  • 是的,我想是的。我在 PyCharm 中运行它,效果很好。
猜你喜欢
  • 1970-01-01
  • 2021-09-01
  • 2018-01-22
  • 2018-06-13
  • 2017-08-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-03-31
相关资源
最近更新 更多