【发布时间】: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