динамически рассчитывать количество процессов, которые будут порождены - PullRequest
0 голосов
/ 08 октября 2011

У меня есть список около 15 лет в year_queue, мне нужно порождать один процесс для каждого года. Но в зависимости от того, на каком сервере я запускаю код, количество процессоров может быть разным. Как динамически изменять переменную num_processes в зависимости от количества процессоров на сервере?

Если я установлю num_processes> число процессоров, будет ли он автоматически появляться соответственно? Когда я проверяю это - он создает 15 процессов и распределяет мощность процессора между ними. Я ищу способ сначала создать 'n' число процессов, где n = количество процессоров на сервере, а затем, когда каждый из этих процессов завершится, появится следующий.

for i in range(num_processes):
    worker = ForEachPerson(year_queue, result_queue, i, dict_of_files)
    print "worker spawned for " + str(i)
    worker.start()

results = []
while len(results) < len(years):
    result = result_queue.get()
    results.append(result)

У кого-нибудь была такая же проблема?


while year_queue.empty() != True:
    for i in range(num_processes):
      worker = ForEachPerson(year_queue, result_queue, i, dict_of_files)
      print "worker spawned for " + str(i)
      worker.start()

    # collect results off the queue
    print "results being collected"
    results = []
    while len(results) < len(num_processes):
      result = result_queue.get()
      results.append(result)

Ответы [ 2 ]

3 голосов
/ 08 октября 2011

Использование многопроцессорного пула .Класс выполняет всю утомительную работу по подбору правильного количества процессов и запуску их для вас.Он также не порождает новый процесс для каждой задачи, но повторно использует процессы, когда они завершены.

def process_year(year):
    ...
    return result

pool = multiprocessing.Pool()
results = pool.map(process_year, year_queue)
0 голосов
/ 09 октября 2011
from multiprocessing import Process, Queue, cpu_count
from Queue import Empty

class ForEachPerson(Process):
    def __init__(self, year_queue, result_queue, i, dict_of_files):
        self.year_queue=year_queue
        self.result_queue=result_queue
        self.i=i
        self.dict_of_files=dict_of_files
        super(ForEachPerson, self).__init__()

    def run(self):
        while True:
            try:
                year=self.year_queue.get()

                ''' Do something '''

                self.result_queue.put(year)
            except Empty:
                self.result_queue.close()
                return

if __name__ == '__main__':
    year_queue=Queue()
    result_queue=Queue()
    dict_of_files={}

    start_year=1996
    num_years=15

    for year in range(start_year, start_year + num_years):
        year_queue.put(year)

    workers=[]
    for i in range(cpu_count()):
        worker = ForEachPerson(year_queue, result_queue, i, dict_of_files)
        print 'worker spawned for', str(i)
        worker.start()
        workers.append(worker)

    results=[]
    while len(results) < num_years:
        try:
            year=result_queue.get()
            results.append(year)
            print 'Result:', year
        except Empty:
            pass

    for worker in workers:
        worker.terminate()
...