簡體   English   中英

Python多處理/線程與只讀的共享變量

[英]Python multiprocessing/threading with shared variables that only will be read

考慮下面的代碼。 我想一次運行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

檢查文檔,具體來說:

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__可以導入__main__方法。 這在編程指南中有所涉及,但值得在此指出。 這意味着某些示例(例如multiprocessing.Pool示例)在交互式解釋器中不起作用

你必須始終牢記線程並不真正並行,如果那是你真正想要的。

我不解釋實際問題是什么......? 如果你只想要3個線程同時運行,為什么不只啟動3個線程?

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM