Python多处理/线程与只读的共享变量

时间:2010-06-18 16:53:31

标签: python multithreading multiprocessing

考虑以下代码。我想一次运行3个实验。实验是独立的,他们唯一共享的是他们只阅读的Model对象。

由于在解决这个问题上似乎没有什么困难,我怎样才能在Python中做到最好?我想使用一个池左右,以确保一次只运行三个实验。我应该使用多处理吗?如果是的话,最短最简洁的是什么?

#!/usr/bin/env python2.6
import time

class Model:
    name = ""
    def __init__(self,name):
        self.name = name

class Experiment:
    id = 0
    model = None
    done = False

    def __init__(self,id,model):
        self.id = id
        self.model = model

    def run(self):
        for _ in range(0,60):
            print "Hey %s from experiment %d" % (self.model.name, id)
            time.sleep(1)
        self.done = True


if __name__ == "__main__":
    experiments = []
    model = Model("statictistical model")
    for i in range(0,5):
        experiments.append(Experiment(i, model))

    #How to run 3 experiments at the same time

2 个答案:

答案 0 :(得分:3)

检查文档,特别是:

http://docs.python.org/library/multiprocessing.html#module-multiprocessing.pool

那里有很多例子可以帮助你。例如,我可以提出:

#!/usr/bin/env python2.6
import time
import multiprocessing

class Model:
    name = ""
    def __init__(self,name):
        self.name = name

def run_experiment(id, model):
    print "Experiment %d is starting" % id
    for _ in range(0,60):
        print "Hey %s from experiment %d" % (model.name, id)
        time.sleep(1)
    print "Experiment %d is done" % id
    return "Result for %d" % id


if __name__ == "__main__":
    model = Model("statictistical model")
    experiments = ((i, model) for i in range(0, 5))
    pool = multiprocessing.Pool(3)

    results = [pool.apply_async(run_experiment, experiment) for experiment in experiments]
    for result in results:
        r = result.get()
        # do something with r
        # or nothing, i suppose...

还要注意文档对使用multiprocessing模块的说法:

  

此包中的功能   要求__main__方法   可由儿童进口。这是   编程指南中包含   但是值得指出这里。   这意味着一些例子,如   multiprocessing.Pool个例子   不会在互动中工作   解释

答案 1 :(得分:1)

你必须始终牢记线程并不真正并行,如果这是你真正想要的。

我不知道实际问题是什么......?如果你只想要3个线程同时运行,为什么不只启动3个线程呢?