• python 生产者消费者demo


    # -*- coding:utf-8 -*-
    from multiprocessing import JoinableQueue, Process, Value
    
    import time
    
    DOWNLOAD_EXCEPTION_MINUTE = 3
    DEAL_EXCEPTION_MINUTE = 2
    
    
    class SharedObj(object):
        def __init__(self, id):
            self.id = id
            pass
    
    
    from collections import namedtuple
    
    SHARED_OBJ = namedtuple("shared_obj", ["id"])
    
    
    def download_process(produce_queue, minute_list, sharded_time_cost, shared_is_exception):
        def process(minute_name):
            print("Begin download process minute:%s." % minute_name)
            # if minute_name == DOWNLOAD_EXCEPTION_MINUTE:
            #     raise Exception("Exception in minute_name:%s when download process." % minute_name)
    
            time.sleep(10)
            print("Success download progress minute:%s." % minute_name)
    
        try:
            start_time = time.time()
            for minute_name in minute_list:
                if shared_is_exception.value:
                    print("Some other error happened when begin download minute:%s." % minute_name)
                    break
                process(minute_name)
                produce_queue.put(minute_name)
            end_time = time.time()
            with sharded_time_cost.get_lock():
                sharded_time_cost.value = int(end_time - start_time)
        except Exception as e:
            print(e)
            if shared_is_exception.value:
                print("Some other error happened.")
    
            with shared_is_exception.get_lock():
                shared_is_exception.value = 1
        #
        produce_queue.put(None)
        produce_queue.join()
    
    
    def deal_process(produce_queue, shared_deal_time_cost, shared_done_minute_name, shared_done_count, shared_is_exception,
                     s):
        def process():
            print("Begin deal minute:%s." % minute_name)
            # if minute_name == DEAL_EXCEPTION_MINUTE:
            #     raise Exception("Exception happened in minute:%s, when deal." % minute_name)
            print(s)
            time.sleep(5)
            print("Done for deal minute:%s." % minute_name)
    
        while True:
            minute_name = produce_queue.get()
            #
            print("-----deal process----")
            print("shared_deal_time_cost:%s." % shared_deal_time_cost.value)
            print("shared_done_minute_name:%s." % shared_done_minute_name.value)
            print("shared_done_count:%s." % shared_done_count.value)
            print("shared_is_exception:%s." % shared_is_exception.value)
            print("---------------------")
            #
            if minute_name is None:
                print("Get empty minute name, done for deal.")
                produce_queue.task_done()
                break
    
            try:
                begin_time = time.time()
                if not shared_is_exception.value:
                    process()
                else:
                    print("shared_is_exception is true, exception is happened; continue...")
                end_time = time.time()
                #
                with shared_deal_time_cost.get_lock():
                    shared_deal_time_cost.value += int(end_time - begin_time)
                with shared_done_minute_name.get_lock():
                    shared_done_minute_name.value = minute_name
                with shared_done_count.get_lock():
                    shared_done_count.value += 1
            except Exception as e:
                print (e)
                if not shared_is_exception.value:
                    with shared_is_exception.get_lock():
                        shared_is_exception.value = 1
            finally:
                #
                produce_queue.task_done()
    
    
    class TestObj(object):
        def __init__(self):
            self.shared_done_minute = Value("i", 0)
            self.shared_done_count = Value("i", 0)
            self.shared_download_time_cost = Value("i", 0)
            self.shared_deal_time_cost = Value("i", 0)
            self.shared_is_exception = Value("i", 0)
    
        def main_process(self, ):
            minute_list = [1, 2, 3, 4, 5]
            #
            produce_queue = JoinableQueue()
            download_processor = Process(target=download_process,
                                         args=(produce_queue, minute_list, self.shared_download_time_cost,
                                               self.shared_is_exception,))
            #
            s = SharedObj(id=1)
            print(s)
            deal_processor = Process(target=deal_process, args=(
                produce_queue, self.shared_deal_time_cost, self.shared_done_minute, self.shared_done_count,
                self.shared_is_exception, s,))
            start_time = time.time()
            #
            download_processor.daemon = True
            deal_processor.daemon = True
            #
            download_processor.start()
            deal_processor.start()
            #
            download_processor.join()
            deal_processor.join()
            #
            end_time = time.time()
            print("Main time cost:%s." % (end_time - start_time))
    
    
    def main():
        test_obj = TestObj()
        test_obj.main_process()
    
    
    if __name__ == '__main__':
        main()
    

      

  • 相关阅读:
    一文带你看清HTTP所有概念
    程序员不得不了解的硬核知识大全
    看完这篇HTTP,跟面试官扯皮就没问题了
    ReentrantLock 源码分析从入门到入土
    计算机网络的核心概念
    Kafka 的这些原理你知道吗
    2019 我是怎么熬过来的?
    不懂什么是锁?看看这篇你就明白了
    机器学习——方差、协方差与皮尔逊值
    最小生成树的本质是什么?Prim算法道破天机
  • 原文地址:https://www.cnblogs.com/dasheng-maritime/p/13964195.html
Copyright © 2020-2023  润新知