首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Python多进程池--每个进程共享一个变量?

Python多进程池--每个进程共享一个变量?
EN

Stack Overflow用户
提问于 2018-06-22 03:48:52
回答 2查看 132关注 0票数 0

我一直在尝试寻找一个简单的示例,其中我在我的进程池中为每个启动的进程共享一个常量变量。大多数示例向您展示了如何跨进程共享变量,这不是我想要的。

代码语言:javascript
复制
import multiprocessing
import time

data = (
    {"var":1, "shared": None}, {"var":2, "shared": None}, {"var":3, "shared": None}, {"var":4, "shared": None}
)

def mp_worker(input):
    print input
    # print " Processs %s\tWaiting %s seconds" % (inputs, the_time)
    # time.sleep(int(the_time))
    # print " Process %s\tDONE" % inputs

def mp_handler():
    p = multiprocessing.Pool(2)
    p.map(mp_worker, data)

if __name__ == '__main__':
    mp_handler()

例如,如果我运行这段代码,我希望我的“共享”组件为每个进程初始化一次。

我想做这样的事情(这行不通):

代码语言:javascript
复制
from multiprocessing import Pool, Process

class Worker(Process):
    def __init__(self):
        print 'Worker started'
        # do some initialization here
        super(Worker, self).__init__()

    def compute(self, data):
        print 'Computing things!'
        return data * data


if __name__ == '__main__':
    # This works fine
    worker = Worker()
    #print worker.compute(3)

    # workers get initialized fine
    pool = Pool(processes = 4,
                initializer = Worker)
    data = range(10)
    # How to use my worker pool?
    # result = pool.map(Worker.compute, data)

    result = pool.map(Worker.compute, data)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-27 05:15:28

代码语言:javascript
复制
def init(args, num_gpu):
    pid = int(str(multiprocessing.current_process()).split(" ")[0].split("-")[-1].split(",")[0]) - 1
    gpu_id = pid % num_gpu
    global testModule
    testModule = TestModuleShared(args, gpu_id)

def worker(datum):
    pid = int(str(multiprocessing.current_process()).split(" ")[0].split("-")[-1].split(",")[0]) - 1
    params = datum["params"]
    # print str(datum["fc"]) + " " + str(pid) 
    # print testModule.openpose

    # Reset State
    testModule.run()

p = multiprocessing.Pool(per_gpu_threads*num_gpu, initializer=init, initargs=(params["test_module_param"],num_gpu,))

事实证明,您可以只使用全局变量关键字,以及一个初始化器回调来初始化它。

票数 0
EN

Stack Overflow用户

发布于 2018-06-22 04:05:41

使用shared c_types:

代码语言:javascript
复制
from multiprocessing import Process, Lock
from multiprocessing.sharedctypes import Value
from ctypes import Structure, c_double

class Point(Structure):
    _fields_ = [('x', c_double), ('y', c_double)]

def modify(parmMap):
    parmMap['point'].x = parmMap['var']
    parmMap['point'].y = parmMap['var'] * 2


if __name__ == '__main__':
    lock = Lock()

    data = ( {'var' : 1, 'shared' : Value(Point, (0,0), lock=lock) },
             {'var' : 2, 'shared' : Value(Point, (0,0), lock=lock) },
             {'var' : 3, 'shared' : Value(Point, (0,0), lock=lock) },
             {'var' : 4, 'shared' : Value(Point, (0,0), lock=lock) }
    )

    p = multiprocessing.Pool(2)
    print p.map(mp_worker, data)
    print data
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50976485

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档