并行运行的对象的方法无法看到属性的更改

时间:2018-01-21 17:33:00

标签: python multiprocessing

我有一个带有两个主体函数的对象: 1)一个是"扫描",当找到感兴趣的东西时,将它添加到列表中,即当前对象的属性。 2)第二个对列表中找到并存储的内容进行操作。 我希望第一个函数运行很长时间,比如在后台运行,第二个函数处理存储的内容。所以我尝试使用多线程。

但是当我的第一个功能修改列表时,第二个功能无法看到修改。下面的最小例子。

这是最小的例子。

# coding: utf-8

import numpy as npy
import time
from multiprocessing import Process, RLock

class MyStruct(object):

    def __init__(self):
        self.listOfInterest = []

    def searching(self):
        while True:
            time.sleep(2) # unelegant way to be sure that one process doesn't block other one from running
            a = npy.random.randn(1)[0] # random way to add something to the list
            if a>=0:
                self.listOfInterest.append(a)
                print(' add ',str(a),' to list ')

    def doingStuff(self):
        while True:
            time.sleep(1) 
            try:
                a = self.listOfInterest[0] # pb here : list allways empty for this function
               # doing stuff on a we don't care here
            except IndexError:
                print(' list still empty, nothing to deal with ')

if __name__=='__main__':
    mystruct = MyStruct()
    p1 = Process(target=mystruct.searching)
    p2 = Process(target=mystruct.doingStuff)
    p1.start()
    p2.start()
    p1.join()
    p2.join()

1 个答案:

答案 0 :(得分:0)

在我的问题中评论“跳”后,答案很简单。只需使用Thread而不是进程。

在浏览维基百科后,在第一个和粗略的近似中,我们可以说线程和进程都是一个指令列表,但线程共享内存。

如果我们想要更精确(如果我们尝试......那就是leat),这是有问题的代码中发生的事情:

1)我们运行命令“python3 MyStruct.py”,内核启动一个进程,让我们称之为P.这个进程得到它的内存,并在某些部分存储一个由python构建的对象mystruct

2)当P运行命令p1.start()和p2.start()时,它会产生我们称之为fork的东西。就像在两个细胞中分裂的生物细胞一样,它变成了两个过程,让我们称之为P1和P2,它们中的每一个都独立于另一个。他们每个人都获得了一个对象的副本,并在其上工作。所以,当他们修改listOfInterest时,它对象就是自己的进程内存,所以另一个无法看到它。

如果我们使用线程而不是进程,那么进程P运行两个线程,它们将共享内存。

这里是修改代码

import numpy as npy
import time
from threading import Thread

class MyStruct(object):

    def __init__(self):
        self.listOfInterest = []

    def searching(self):
        while True:
            time.sleep(2) # unelegant way to be sure that one process doesn't block other one from running
            a = npy.random.randn(1)[0] # random way to add something to the list
            if a>=0:
                self.listOfInterest.append(a)
                print(' add ',str(a),' to list ')

    def doingStuff(self):
        while True:
            time.sleep(1) 
            try:
                a = self.listOfInterest[0] # pb here : list allways empty for this function
                # doing stuff on a we don't care here
            except IndexError:
                print(' list still empty, nothing to deal with ')

if __name__=='__main__':
    mystruct = MyStruct()
    p1 = Thread(target=mystruct.searching)
    p2 = Thread(target=mystruct.doingStuff)
    p1.start()
    p2.start()
    p1.join()
    p2.join()