Python 多进程/多线程读取共享变量
考虑下面的代码。我想同时运行三个实验。这些实验是独立的,它们唯一共享的就是一个模型对象,而这个对象只是被读取。
看起来在多线程方面没有什么难的,我该如何在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
的例子,在交互式解释器中是无法运行的。