条件ロック状態とキュー()

学習前に、基礎のロックを解除し、キューなければなりません

インポートキュー
インポート時間
インポートランダム
インポートがスレッド
asyncioインポートし
、インポートログ
キューインポートから#は空
%(levelname)S - - >%(FUNCNAME)のS logging.basicConfig(レベル= logging.INFO、フォーマット=「%(いるasctime)sは行%(LINENO)D:\ n%(メッセージ)S')
= logging.getLogger()ログ
#queue.qsize不可以限制、作为应答式条件
q_init = queue.Queue(5)

非同期DEFジョブ(アイテム):
    time.sleep(random.randint(1,3))
    の状態= random.randint(0、1)
    の状態== 0の場合:
        リターン( "成功"、項目)
    他:
        リターン( "失敗"、項目)
 
非同期デフdo_work (項目):
    logging.info(%(項目、time.asctime "何か%sの、時間の開始%sの操作を行う"())) 
            試してみてください。
                もしcond.acquire():
                    そうでない場合はq_init.empty():
    A =のawaitジョブ(項目)
    を返す

デフasync_runner(チェッカー):
    new_loop = asyncio.new_event_loop()
    asyncio.set_event_loop(new_loop)
    ループ= asyncio.get_event_loop()
    タスク= asyncio.ensure_future(do_work(チェッカー))
    loop.run_until_complete( asyncio.wait([タスク]))
    ST = task.result()は、
    ST返し

ます:def worker_consumer(q_initは、cond) チェッカー=なし
        !チェッカー= "停止"しながら、#を:
        :真ながら
                        cond.notify()
                        チェッカー= q_init .get()
                        チェッカー== "停止"の場合:
                            cond.release() 
                            壊す
                        ST = async_runner(チェッカー)
                        でST [0]場合は[ "成功"、 "失敗"]:
                            ログ。 INFO(%(ST [1]、ST [0]) "%sのタスク完成状態は%sである")
                            logging.info( "大王我们吃完了%S鹌鹑蛋、再来点吧" %チェッカー)
                            q_init.task_done( )
                    cond.release()
            例外を除い:
                 logging.debug( "キューが空です") 

デフプロデューサー(指揮、q_init):
        アイテム= 1 
        つつ真:
            もしcond.acquire():
                もしq_init.qsize()<5:
                    q_init.put(アイテム) 
                    logging.info( "通知ウズラの卵を追加した赤ちゃんは、それらの%sを食べることができます"%アイテム) 
                    cond.notify()
                他:
                    cond.wait()
                cond.release()
                項目+ = 1 
                項目場合> = 11:
                   ブレーク
        q_init.join()
        範囲(thread_num)で私のために:
            q_init.put( "ストップ")

の場合__name__ == '__main__': 消费者>生产者
        thread_num = 5 
        COND = threading.Condition()
        プロデューサー= [スレッド.Thread(目標=プロデューサー、引数=(COND、q_init))の範囲内のiについて(1)]
        [範囲内のiについてthreading.Thread(目標= worker_consumer、引数=(q_init、COND))(thread_num)]消費者= 
        プロデューサにおけるpの:
                p.start()
        消費者にkの:
                k.start()

        mについてで消費者:
            m.join()

  結果:

2019年12月21日12:50:01781 - INFO - >行70でプロデューサー: 
 子供たちすべてが、プラス通知の下では、卵1ウズラそれらを食べることができます
2019年12月21日12:50:01781 - INFO - >プロデューサーで行70:
 子供はウズラの卵、通知を追加することができますも食べ2 
2019年12月21日12:50:01781 - INFO - >行70でプロデューサー: 
 子供たちは、プラス3個のも食べウズラの卵通知月
2019 -12-21 12:50:01781 - INFO - >行70でプロデューサー: 
 子供たちが全てです、プラス4ウズラの卵の通知は、それらを食べることができます
2019年12月21日12:50:01782 - INFO - >ラインで生産70:
 5個のそれを食べることができるウズラの卵に通知を追加赤ちゃん
2019年12月21日12がある:50:01785 -情報- >ライン22におけるdo_workです:
 。何かを1、21はタイムスタート土曜には2019年12月午前12時50分01秒で
50:12は2019年12月21日である:04787 - - INFO>ライン57は、AT worker_consumerです
 。完成された1つのタスクのステータスが失敗した
2019年12月21日12である:50:04787 - INFO - > worker_consumer ATライン58は:
 私たちは、1個のキングうずら卵を終え、よりそれのいくつかの
2019年12月21日12:50:04788 - INFO - >ライン22 AT do_work:
 何か2、開始時間土12月21日午前12時50分04秒2019やる
2019-12-を12 21:50:06789 - INFO - > worker_consumer ATライン57:
 タスクであるがステータス失敗終了2 
:50:06789 - INFO - > worker_consumer ATライン58:2019年12月21日12 
 我々は2個のウズラの卵を終えた王を、より多くのそれのいくつかの
2019年12月21日12:50:06791 - INFO -ライン22 AT> do_work:
 何か3、開始時間12月21日(土)12時50分06秒2019 
2019年12月21日12:50:08793 - INFO - > worker_consumer ATライン57:
 3タスクのステータスIS終了できなかった
50::2019年12月21日12 08793 - INFO - > worker_consumer ATライン58:
 私たちは、完成3羽のウズラの卵を持っていた王、いくつかのより多くのそれの
2019年12月21日を12:50:08794 - INFO - > 22行でdo_work:
 何か4、開始時間土曜に12月21日は12時50分08秒2019でください。
2019年12月21日12がある:50:09795 - INFO - >ライン57はworker_consumerあるAT:
 4タスクステータス終了したが失敗した
2019年12月21日12時50分に: 09795 - INFO - >行でworker_consumer 58: 
 王は、我々はより多くのそれの一部、4個のウズラの卵を終えた
:50:: - - INFO>ライン22 AT do_work 09796 2019年12月21日12 
 何か5、開始時間土12月2019年午前12時50分09秒21で
2019年12月21日12である:50:12798 - INFO - >ライン57はworker_consumer ATです
 。5タスクステータスが終了した成功
2019年12月21日12は次のとおりです。50:12798 - INFO - > AT worker_consumer行58:
 我々は5個のウズラの卵、より多くのそれのいくつか終えた王
50::2019年12月21日12 12799を- INFO - >行70でプロデューサー: 
 子供たちが全てです、プラス7ウズラの卵は気付かず食べることができる
2019から12を-21 12:50:12799 - INFO - >行70でプロデューサー:
 子供たちは、すべてのある、プラス8個のうずら卵の通知は、それらを食べることができる
2019年12月21日12:50:12799 - INFO - >行70でプロデューサー: 
 子供たちが全てです、プラス9個のウズラの卵の下の通知は、それらを食べることができます
2019-12- 21 12:50:12799 - INFO - >行70でプロデューサー: 
 子供たちは、通知が追加さも10ウズラの卵を食べることもしている
2019年12月21日12は次のとおりです。50:12801 - INFO -ライン22における> do_workです:
 DO 。7何か、開始時間土曜に12月21日は12時50分12秒2019で
2019年12月21日12がある:50:14802 - INFO - >ライン57はworker_consumer ATです
 。7つのタスクステータス終了した成功
2019年12月21日12は次のとおりです。50:14802 - INFO - > 58行でworker_consumer : 
 王たちは7個のウズラの卵を終え、いくつかのより多くのこと
2019年12月21日12:50:14804 - INFO -ライン22 AT> do_work:
 何か8の操作を行い、開始時間12月21日(土) 2019年12時50分14秒
2019年12月21日12:50:17805 - INFO - > worker_consumer ATライン57:
 終了した成功タスクステータス8 
2019年12月21日12:50:17805 - INFO - > worker_consumer ATライン58:
 キング我々は8個のウズラの卵、それをより多くのいくつかの終了
50::2019年12月21日12 - INFO 17806を - - > do_work ATライン22は以下のとおりです。
 何かを9、開始時間土で12月21日は12時50分17秒2019である。
2019年12月21日12である:50:20808 - INFO - >ライン57はworker_consumerあるAT:
 IS完成9タスクのステータスが失敗した。
2019-を12-21 12:50:20808 - INFO - 58行で> worker_consumer: 
 私たちは9個のウズラの卵を終えた王、より多くのそれのいくつかの
2019年12月21日12:50:20810 - INFO -ライン22 AT> do_work:
 DO 10何かが、開始時間土曜に12月21日は12時50分20秒2019で
2019年12月21日12である:50:23810 - - INFO>ライン57は、AT worker_consumerで
 完成10失敗したタスクのステータス
2019年12月21日12:50:23810 - INFO - 58行で> worker_consumer: 
 私たちは10個のウズラの卵、それのいくつかのより多くを終えたキング

  

おすすめ

転載: www.cnblogs.com/SunshineKimi/p/12076618.html