这段代码在linux上执行,但是抛出AttributeError:类型对象“ T”在Windows上没有属性“ val”,为什么?
from multiprocessing import Process
import sys
class T():
@classmethod
def init(cls, val):
cls.val = val
def f():
print(T.val)
if __name__ == '__main__':
T.init(5)
f()
p = Process(target=f, args=())
p.start()
Windows缺少fork()
系统调用,该系统调用重复了当前过程。这有很多含义,包括Windows多处理文档页面上列出的含义。进一步来说:
请记住,如果在子进程中运行的代码尝试访问全局变量,则它看到的值(如果有)可能与调用Process.start时父进程中的值不同。
在内部,python通过从头开始一个新进程并告诉它再次加载所有模块,从而在Windows上创建了一个新进程。因此,您在当前流程中所做的任何更改都不会显示。
在您的示例中,这意味着在子进程中,将加载您的模块,但是该if __name__ == '__main__'
部分将不会运行。因此T.init
将不会被调用,并且T.val
将不存在,因此您将看到错误。
另一方面,在POSIX系统(包括Linux)上,流程创建使用fork,所有全局状态都保持不变。该子项带有所有内容的副本,因此它不必重新加载任何内容,并且将看到其副本T
和的副本val
。
这也意味着在POSIX系统上,进程的创建要快得多,资源占用也要少得多,特别是因为“复制”使用写时复制来避免实际复制数据的开销。
使用多重处理时还有其他怪癖,请参阅python多重处理指南中详细说明。
问题内容: 我一直在阅读有关Python的多处理模块的信息。我仍然认为我对它可以做什么没有很好的了解。 假设我有一个四核处理器,并且我有一个包含1000000个整数的列表,我想要所有整数的总和。我可以简单地做: 但这仅将其发送到一个内核。 是否有可能使用多处理模块将数组划分为多个,并让每个核获得其部分的总和并返回值,以便可以计算总和? 就像是: 任何帮助,将不胜感激。 问题答案: 是的,可以对多个
问题内容: 这个问题可能已经有人提出过,而且回答的可能性更大,但是我不知道在哪里可以找到它。 问题:我有一个用于pythonflask的路由器,该路由器需要花费一些时间来处理每个调用的数据。我需要使对路由的每个调用本身就是一个线程,因此它不必等待请求被加载。 问题答案: Flask带有内置的开发Web服务器,但是你不应该在生产环境中使用它。 为了获得一些很酷的功能,例如为每个请求和静态文件服务提供
问题内容: 如何在没有多线程的情况下在python中运行多个进程?例如考虑以下问题: 我们必须制作一个Gui,它具有一个启动一个函数的开始按钮(例如,打印所有整数),还有一个停止按钮,以便单击该按钮可以停止该函数。 如何在Tkinter中做到这一点? 问题答案: 然后,您需要将小部件与启动工作线程的函数绑定在一起。例如: 通过这种方法,您只能通过更改其值来优雅地结束线程。注意,使用多个线程可避免在
本文向大家介绍多处理和多线程之间的区别,包括了多处理和多线程之间的区别的使用技巧和注意事项,需要的朋友参考一下 多处理 多处理是指在单个系统中使用多个CPU /处理器。多个CPU可以并行运行,并一起执行多个进程。它们在很大程度上提高了计算能力。对称多重处理和非对称多重处理是两种类型的多重处理。 多线程 多线程是指由单个CPU执行的多个线程,使得每个线程以并行方式执行,并且CPU /处理器使用上下文
我的工作应该使用并行技术,我是python的新用户。因此,我想知道您是否可以分享一些关于python和模块的资料。这两者有什么区别?
我有一个图像路径列表,我想在进程或线程之间划分,以便每个进程处理列表的某些部分。处理包括从磁盘加载图像,进行一些计算并返回结果。我正在使用Python 2.7 下面是我如何创建辅助进程 我所面临的问题是,当我在initializer函数中记录初始化时间时,我知道worker不是并行初始化的,而是每个worker都以5秒的间隔初始化,下面是供参考的日志 我尝试过使用将同时启动辅助线程 我知道Wind