代码之家  ›  专栏  ›  技术社区  ›  Peter Smit

Python多处理/线程,共享变量只能读取

  •  1
  • Peter Smit  · 技术社区  · 14 年前

    既然在解决这个问题时似乎没有什么困难的事情,那么如何才能在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 回复  |  直到 14 年前
        1
  •  3
  •   Vin-G    14 年前

    检查文件,具体如下:

    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 示例 在交互模式下不起作用 口译译员

        2
  •  1
  •   xyz-123    14 年前

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

    我不明白真正的问题是什么。。。?如果您只希望3个线程同时运行,为什么不只启动3个线程呢?