ホームページ >バックエンド開発 >Python チュートリアル >Pythonのスレッドとコルーチンのまとめ
以下のエディターは、Python の単純なスレッドとコルーチンに関する学習体験 (共有) を提供します。編集者はこれが非常に良いものだと思ったので、皆さんの参考として今から共有します。エディターをフォローして見てみましょう
Python のスレッドのサポートは確かに十分ではありませんが、Python には完全な非同期ネットワーク フレームワーク モジュールがあると言われています。今後学習していきたいと思います。 Python のスレッド
スレッド ライブラリを使用して、任意の Python 呼び出し可能オブジェクトを別のスレッドで実行できます。このモジュールはスレッド関連の操作を十分にサポートしていませんが、単純なスレッドを使用して I/O 操作を処理し、プログラムの応答時間を短縮することができます。
from threading import Thread import time def countdown(n): while n > 0: print('T-minus:', n) n -= 1 t = Thread(target=countdown, args=(10,)) t.start() # 开启线程 time.sleep(2) if t.is_alive() is True: print("停止线程...") t._stop() # 停止线程
start関数はスレッドの開始に使用され、_stop関数はスレッドの停止に使用されます。スレッドで I/O 操作を実行する際のブロックなどの問題を防ぐために、一定期間実行した後、スレッドがまだ生きているかどうかを判断できます。スレッドがまだ存在する場合は、_stop() を呼び出してスレッドを停止します。ブロックを防止します (_stop 関数をクラスにカプセル化できますが、ここではそれを行いませんでした)。
もちろん、スレッドを手動で作成する代わりに、ThreadPool スレッド プールを呼び出して処理することもできます。スレッド間で変数を共有する必要がない場合は、スレッドを使用すると非常に便利です。これにより、多くの面倒な操作が軽減され、時間を節約できます。スレッド間で通信する必要がある場合は、キューを使用してそれを実現できます。
from queue import Queue from threading import Thread class kill: def terminate(self, t): if t.isAlive is True: t._stop() def product(out_q): for i in range(5): out_q.put(i) def consumer(in_q): for i in range(5): print(in_q.get()) q = Queue() t1 = Thread(target=consumer, args=(q,)) t2 = Thread(target=product, args=(q,)) t1.start() t2.start() k = kill() # 查询线程是否终止,防止阻塞... k.terminate(t1) k.terminate(t2)
Queue インスタンスはすべてのスレッドによって共有され、必要なロックがすべて備わっているため、共有されるスレッドの数に関係なく 安全 になります。 。ここで注意してください。マルチスレッド環境では信頼性が低いため、マルチスレッドでは put() メソッドと get() メソッド以外のキュー クラス メソッドを使用しないでください。スレッド内での単純かつ少量のデータ通信には、キューを使用できます。大きなデータでインタラクティブな通信が必要な場合は、Python で使用できる関連モジュールが提供されます。具体的には、baidu が必要です。
いわゆるコルーチンは、実際にはシングルスレッド環境の yield プログラムです。
from collections import deque def countdown(n): while n > 0: print("T-minus", n) yield # 返回之后下次直接从这里执行...相当于C#里面得yield return . n -= 1 print("this is countdown!!!") def countup(n): x = 0 while x < n: print("Counting up", x) yield x += 1 class TaskScheduler: def init(self): self._task_queue = deque() def new_task(self, task): self._task_queue.append(task) def run(self): while self._task_queue: task = self._task_queue.popleft() try: next(task) self._task_queue.append(task) except StopIteration: pass sche = TaskScheduler() sche.new_task(countdown(10)) sche.new_task(countdown(5)) sche.new_task(countup(15)) sche.run()
この期間に Python を使用した経験について話しましょう。Python は確かに優れていますが、そのパフォーマンスも批判されています。私も Python を学び始めたとき、少なくともいくつかのクールなプログラムを作成しました。 . Python の自然言語処理を使用して感情分析や最も人気のあるクローラー プログラムを実行したり、クールなデータ分析グラフを作成したりするなど、高機能です。プログラムの焦点はそれらにありません。基本的な構文を理解し、公式ドキュメントを理解している限り、プログラム コードの焦点はパフォーマンスと最適化にあるため、徐々にそれらを手放していきます。可能な限り、最も完全な機能、最高のパフォーマンス、最も美しい構造を備えたプログラムを作成することは、実際、政治の先生がよく言う「文化的ソフトパワー」に似ています。プログラムには、最も適切な設計パターンを埋め込み、最も完全なプログラムの最適化を実行し、最もパフォーマンスを節約するデータ構造を採用する必要があります。
以上がPythonのスレッドとコルーチンのまとめの詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。