1. 程式人生 > >再讀《Parallel Programming with Python》並作筆記

再讀《Parallel Programming with Python》並作筆記

慢慢 img set tin 外文 {} ons list gin

並發編程,在哪個語言裏都屬於高端應用,一定得會了才好意思說懂了這門語言。

在工作中用得並不是很多,忘了一些內容,就慢慢看,慢慢補上。

今天一天看了近三分之一(我看外文越來越快了??:)),

實踐一下多線程的threading模塊。

技術分享

#coding: utf-8

import logging, threading
from Queue import Queue

logger = logging.getLogger()
logger.setLevel(logging.DEBUG)
formatter = logging.Formatter(‘%(asctime)s - %(message)s‘)

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

fibo_dict = {}
shared_queue = Queue()
input_list = [30, 10, 55, 71]

queue_condition = threading.Condition()

def fibonacci_task(condition):
    with condition:
        while shared_queue.empty():
            logger.info("[%s] - waiting for elements in queue..."
                        % threading.current_thread().name)
            condition.wait()
        else:
            value = shared_queue.get()
            a, b = 0, 1
            for item in range(value):
                a, b = b, a + b
                fibo_dict[value] = a
        shared_queue.task_done()
        logger.debug("[%s] fibonacci of key [%d] with result [%d]" %
                     (threading.current_thread().name, value, fibo_dict[value]))

def queue_task(condition):
    logging.debug(‘Starting queue_task...‘)
    with condition:
        for item in input_list:
            shared_queue.put(item)
        logging.debug("Notifying fibonacci_task threads that the queue is ready to consume...")
        condition.notifyAll()

threads = [threading.Thread(target=fibonacci_task,
                            args=(queue_condition,)) for i in range(4)]
[thread.start() for thread in threads]


prod = threading.Thread(name="queue_task_thread", target=queue_task,
                        args=(queue_condition,))
prod.start()

[thread.join() for thread in threads]

  技術分享

再讀《Parallel Programming with Python》並作筆記