フィボナッチ数列をマルチプロセッシングで計算する。
前回は、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
- 作者: Jan Palach
- 出版社/メーカー: Packt Publishing
- 発売日: 2014/06/25
- メディア: ペーパーバック
- この商品を含むブログを見る