おいも貴婦人ブログ

生物系博士課程満期退学をしたAIエンジニアのブログ。

フィボナッチ数列をマルチプロセッシングで計算する。

前回は、threadingモジュールを使ってフィボナッチ数列を計算しました。今回は、multiprocessingを使いたいと思います。

#!/usr/bin/env python3

import sys, time, random, re, requests
import concurrent.futures
from multiprocessing import Process, cpu_count, current_process, Manager, Queue
import logging
## cpu_count : CPUの数を取得する。
## current_process : プロセスの名前などを取得する。
## Manager : 異なるプロセスで共有されるオブジェクト

logger = logging.getLogger()
logger.setLevel(logging.INFO)
formatter = logging.Formatter('%(asctime)s - %(message)s')

ch = logging.StreamHandler()
ch.setLevel(logging.DEBUG)
ch.setFormatter(formatter)
logger.addHandler(ch)

number_of_cpus = cpu_count()


def producer_task(q, fibo_dict):
    for i in range(15):
        value = random.randint(1,20)
        fibo_dict[value] = None
        logger.info("Producer [%s] putting value [%d] int queue..." % (current_process().name,value))
        q.put(value)

        
def consumer_task(q, fibo_dict):
    while not q.empty():
        value = q.get(True, 0.05)
        a, b = 0, 1
        for item in range(value):
            a, b = b, a + b
            fibo_dict[value] = a
        logger.info("consumer [%s] getting value [%d] from queue...:result=[%d]" % (current_process().name, value, a))

data_queue = Queue()

fibo_dict={}
producer = Process(target=producer_task, args=(data_queue, fibo_dict))
producer.start()
producer.join()

consumer_list = []

for i in range(number_of_cpus):
    consumer = Process(target=consumer_task, args=(data_queue,fibo_dict))
    consumer.start()
    consumer_list.append(consumer)

[consumer.join() for consumer in consumer_list]

出力

2015-10-07 01:43:56,941 - Producer [Process-1] putting value [8] int queue...
2015-10-07 01:43:56,943 - Producer [Process-1] putting value [3] int queue...
2015-10-07 01:43:56,943 - Producer [Process-1] putting value [17] int queue...
2015-10-07 01:43:56,944 - Producer [Process-1] putting value [15] int queue...
2015-10-07 01:43:56,944 - Producer [Process-1] putting value [16] int queue...
2015-10-07 01:43:56,944 - Producer [Process-1] putting value [15] int queue...
2015-10-07 01:43:56,944 - Producer [Process-1] putting value [20] int queue...
2015-10-07 01:43:56,945 - Producer [Process-1] putting value [8] int queue...
2015-10-07 01:43:56,945 - Producer [Process-1] putting value [13] int queue...
2015-10-07 01:43:56,945 - Producer [Process-1] putting value [13] int queue...
2015-10-07 01:43:56,945 - Producer [Process-1] putting value [4] int queue...
2015-10-07 01:43:56,946 - Producer [Process-1] putting value [4] int queue...
2015-10-07 01:43:56,946 - Producer [Process-1] putting value [10] int queue...
2015-10-07 01:43:56,946 - Producer [Process-1] putting value [18] int queue...
2015-10-07 01:43:56,946 - Producer [Process-1] putting value [9] int queue...
2015-10-07 01:43:56,984 - consumer [Process-3] getting value [8] from queue...:result=[1]
2015-10-07 01:43:56,986 - consumer [Process-3] getting value [3] from queue...:result=[1]
2015-10-07 01:43:56,987 - consumer [Process-3] getting value [17] from queue...:result=[1]
2015-10-07 01:43:56,989 - consumer [Process-4] getting value [15] from queue...:result=[1]
2015-10-07 01:43:56,989 - consumer [Process-5] getting value [16] from queue...:result=[1]
2015-10-07 01:43:56,990 - consumer [Process-4] getting value [15] from queue...:result=[1]
2015-10-07 01:43:56,991 - consumer [Process-3] getting value [20] from queue...:result=[1]
2015-10-07 01:43:56,991 - consumer [Process-5] getting value [8] from queue...:result=[1]
2015-10-07 01:43:56,991 - consumer [Process-3] getting value [13] from queue...:result=[1]
2015-10-07 01:43:56,992 - consumer [Process-2] getting value [13] from queue...:result=[1]
2015-10-07 01:43:56,993 - consumer [Process-3] getting value [4] from queue...:result=[1]
2015-10-07 01:43:56,994 - consumer [Process-2] getting value [4] from queue...:result=[1]
2015-10-07 01:43:56,994 - consumer [Process-4] getting value [10] from queue...:result=[1]
2015-10-07 01:43:56,995 - consumer [Process-5] getting value [18] from queue...:result=[1]
2015-10-07 01:43:57,007 - consumer [Process-3] getting value [9] from queue...:result=[1]
Process Process-4:
Process Process-2:

参考文献

Parallel Programming With Python

Parallel Programming With Python