Python Process子类中的共享变量

时间:2014-05-30 19:23:50

标签: python process multiprocessing pywin32

我想知道是否可以在Python Process子类中创建某种静态集来跟踪当前异步运行的类型进程。

class showError(Process):
    # Define some form of shared set that is shared by all Processes
    displayed_errors = set()

    def __init__(self, file_name, error_type):
        super(showError, self).__init__()
        self.error_type = error_type

    def run(self):
        if error_type not in set:
            displayed_errors.add(error_type)
            message = 'Please try again. ' + str(self.error_type)
            winsound.MessageBeep(-1)
            result = win32api.MessageBox(0, message, 'Error', 0x00001000)

            if result == 0:
                displayed_errors.discard(error_type)

这样,当我使用相同的error_type创建/启动多个showError进程时,将不会创建后续错误窗口。那么我们如何定义这个共享集呢?

1 个答案:

答案 0 :(得分:3)

您可以使用multiprocessing.Manager.dict(没有set对象可用,但您可以以相同方式使用dict并在所有子流程之间共享。

import multiprocessing as mp

if __name__ == "__main__":
    m = mp.Manager()
    displayed_errors = m.dict()
    subp = showError("some filename", "some error type", displayed_errors)

然后更改showError.__init__以接受共享字典:

def __init__(self, file_name, error_type, displayed_errors):
    super(showError, self).__init__()
    self.error_type = error_type
    self.displayed_errors = displayed_errors

然后这个:

displayed_errors.add(error_type)

变为:

self.displayed_errors[error_type] = 1

而且:

displayed_errors.discard(error_type)

变为:

try:
    del self.displayed_errors[error_type]
except KeyError:
    pass