Python类继承多处理,访问类成员时遇到问题

发布于 2024-12-06 04:10:43 字数 513 浏览 0 评论 0原文

简而言之,假设我有以下内容:

import multiprocessing

class Worker(multiprocessing.Process):
    def __init__(self):
        multiprocessing.Process.__init__(self)
        print "Init"
        self.value = None

    def run(self):
        print "Running"
        self.value = 1

p = Worker()
p.start()
p.join()
print p.value

我希望输出为:

Init
Running
1

相反,

Init
Running
None

有人可以向我解释为什么会出现这种情况吗?我不明白什么,我应该如何正确地做?

谢谢。

In short, say I have the following:

import multiprocessing

class Worker(multiprocessing.Process):
    def __init__(self):
        multiprocessing.Process.__init__(self)
        print "Init"
        self.value = None

    def run(self):
        print "Running"
        self.value = 1

p = Worker()
p.start()
p.join()
print p.value

I'd expect the output to be:

Init
Running
1

Instead it is

Init
Running
None

Can someone explain to me why this is the case? What am I not understanding, and how should I go about doing it correctly?

Thanks.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

鸢与 2024-12-13 04:10:43

当你说p.start()时,一个单独的进程就会从主进程中分叉出来。所有变量值都被复制。因此,主进程有一份 p 副本,而分叉进程则有一份单独的 p 副本。 Worker 修改了分叉进程的 p.value 副本,但主进程的 p.value 仍然是 None

有很多方法可以在进程之间共享对象。在这种情况下,也许最简单的方法是使用 mp.Value

import multiprocessing as mp

class Worker(mp.Process):
    def __init__(self):
        print "Init"
        mp.Process.__init__(self)
        self.num = mp.Value('d', 0.0)

    def run(self):
        print "Running"
        self.num.value = 1

p = Worker()
p.start()
p.join()
print p.num.value

请注意,mp.Value 的默认值为 0.0。它不能设置为None

The moment you say p.start(), a separate process is forked off of the main process. All variable values are copied. So the main process has one copy of p, and the forked process has a separate copy of p. The Worker modifies the forked process's copy of p.value, but the main process's p.value still is None.

There are many ways to share objects between processes. In this case, perhaps the easiest way is to use a mp.Value:

import multiprocessing as mp

class Worker(mp.Process):
    def __init__(self):
        print "Init"
        mp.Process.__init__(self)
        self.num = mp.Value('d', 0.0)

    def run(self):
        print "Running"
        self.num.value = 1

p = Worker()
p.start()
p.join()
print p.num.value

Note that the mp.Value has a default value of 0.0. It can not be set to None.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文