Python 多进程/多线程读取共享变量

1 投票
2 回答
3036 浏览
提问于 2025-04-16 00:09

考虑下面的代码。我想同时运行三个实验。这些实验是独立的,它们唯一共享的就是一个模型对象,而这个对象只是被读取。

看起来在多线程方面没有什么难的,我该如何在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 个回答

1

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

我不太明白实际的问题是什么...? 如果你只想让3个线程同时运行,为什么不直接只启动3个线程呢?

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 的例子,在交互式解释器中是无法运行的。

撰写回答