ホームページ  >  記事  >  バックエンド開発  >  Pythonのスレッドとコルーチンのまとめ

Pythonのスレッドとコルーチンのまとめ

零下一度
零下一度オリジナル
2017-06-16 10:29:111020ブラウズ

以下のエディターは、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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。