Многопроцессорная обработка / многопоточность Python с общими переменными, которые только будут прочитаны - PullRequest
1 голос
/ 18 июня 2010

Учитывая код ниже. Я хотел бы провести 3 эксперимента одновременно. Эксперименты независимы, единственное, что они делят, это объект модели, который они только читают.

Поскольку, похоже, нет ничего сложного в продвижении этого, как я могу лучше всего это сделать в 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 ]

3 голосов
/ 19 июня 2010

Проверьте документы, а именно:

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 голос
/ 19 июня 2010

Вы всегда должны помнить, что потоки на самом деле не работают параллельно, если это то, что вы действительно хотите.

Я не понимаю, в чем собственно проблема ...? Если вы хотите, чтобы 3 потока работали одновременно, почему бы не запустить только 3 потока?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...