ホームページ  >  記事  >  バックエンド開発  >  Pythonの簡単なスレッドとコルーチンの例を詳しく解説

Pythonの簡単なスレッドとコルーチンの例を詳しく解説

PHP中文网
PHP中文网オリジナル
2017-06-21 16:49:201561ブラウズ

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の簡単なスレッドとコルーチンの例を詳しく解説の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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