学習前に、基礎のロックを解除し、キューなければなりません
インポートキュー インポート時間 インポートランダム インポートがスレッド 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個のウズラの卵、それのいくつかのより多くを終えたキング