不保留结果的多重处理

2024-06-01 03:54:16 发布

您现在位置:Python中文网/ 问答频道 /正文

我尝试运行以下多处理代码:

import multiprocessing

class test(multiprocessing.Process):
    def __init__(self, name):
        multiprocessing.Process.__init__(self)
        self.name = name
        self.finished = False

    def run(self):
        print("executed")
        self.finished = True

test_list = []
test_list.append(test('first'))
test_list.append(test('second'))

for t in test_list:
    t.start()

for t in test_list:
    t.join()

for t in test_list:
    print(t.finished)

并得到结果:

executed
executed
False
False

False输出看起来很奇怪。我已经在方法run中将属性finished设置为True,并且输出executed显示run方法已经执行。如果我在方法run中的self.finished=True之后立即添加一行print(self.finished),那么输出将是True。为什么在多重处理完成后类属性finished会改变?你知道吗

谢谢!你知道吗


Tags: 方法runnameintestselffalsetrue
2条回答

这将允许您在进程之间共享完成的值。它使用multiprocessing.Value来创建一个使用共享内存的共享对象。你知道吗

from multiprocessing import Process, Value

class test(Process):
    def __init__(self, name, fin):
        Process.__init__(self)
        self.name = name
        self.finished = fin

    def run(self):
        print("executed")
        self.finished.value = True

test_list = []
test_list.append(test('first', Value('b', False)))
test_list.append(test('second', Value('b', False)))

for t in test_list:
    t.start()

for t in test_list:
    t.join()

for t in test_list:
    print(bool(t.finished.value))

self.finished = True在另一个进程中执行,并且只更改该进程中的变量,但是您正在打印来自主进程的值。您需要共享的变量。你知道吗

from multiprocessing import Process,Value
from ctypes import c_bool

class test(Process):
    def __init__(self,name):
        super().__init__()
        self.name = name
        self._finished = Value(c_bool,False)

    def run(self):
        print(self.name,'executed')
        self._finished.value = True

    @property
    def finished(self):
        return self._finished.value

if __name__ == '__main__':
    test_list = [test('first'),
                 test('second')]

    for t in test_list:
        t.start()

    for t in test_list:
        t.join()

    for t in test_list:
        print(t.finished)

相关问题 更多 >