Pythonスレッドの一時停止、再開、終了の詳しい説明と例

巴扎黑
リリース: 2017-03-30 14:22:09
オリジナル
3158 人が閲覧しました

Python スレッドの一時停止、再開、終了

Python のスレッド モジュールがマルチスレッドを実装できることは誰もが知っていますが、このモジュールには、スレッド オブジェクトが呼び出した後にスレッドを一時停止、再開、停止するメソッドが用意されていません。 start メソッドのみ。対応するメソッド関数の実行が完了するまで待機できます。つまり、スレッドは一度開始されると制御できなくなります。ただし、一般的な方法は、ループ内でフラグ ビットを判断することです。フラグビットが所定の値に達したら、ループを終了するだけでスレッドを終了できます。しかし、待機の説明を見るまで、どのような方法が良いのかわかりませんでした。スレッド内の Event オブジェクトのメソッド

wait([timeout])

  Block until the internal flag is true. If the internal flag is true on entry, return immediately. Otherwise, block until another thread calls set() to set the flag to true, or until the optional timeout occurs.

  阻塞, 直到内部的标志位为True时. 如果在内部的标志位在进入时为True时, 立即返回. 否则, 阻塞直到其他线程调用set()方法将标准位设为True, 或者到达了可选的timeout时间.

  When the timeout argument is present and not None, it should be a floating point number specifying a timeout for the operation in seconds (or fractions thereof).

  This method returns the internal flag on exit, so it will always return True except if a timeout is given and the operation times out.

  当给定了timeout参数且不为None, 它应该是一个浮点数,以秒为单位指定操作的超时(或是分数)。

  此方法在退出时返回内部标志,因此除非给定了超时且操作超时,否则它将始终返回True。

  Changed in version 2.7: Previously, the method always returned None.

  2.7版本以前, 这个方法总会返回None.
ログイン後にコピー



wait のブロックメカニズムを使用して、一時停止および再開し、ループを使用してフラグを判断して終了できます。以下はコード例です。

#!/usr/bin/env python
# coding: utf-8

import threading
import time

class Job(threading.Thread):

  def __init__(self, *args, **kwargs):
    super(Job, self).__init__(*args, **kwargs)
    self.__flag = threading.Event()   # 用于暂停线程的标识
    self.__flag.set()    # 设置为True
    self.__running = threading.Event()   # 用于停止线程的标识
    self.__running.set()   # 将running设置为True

  def run(self):
    while self.__running.isSet():
      self.__flag.wait()   # 为True时立即返回, 为False时阻塞直到内部的标识位为True后返回
      print time.time()
      time.sleep(1)

  def pause(self):
    self.__flag.clear()   # 设置为False, 让线程阻塞

  def resume(self):
    self.__flag.set()  # 设置为True, 让线程停止阻塞

  def stop(self):
    self.__flag.set()    # 将线程从暂停状态恢复, 如何已经暂停的话
    self.__running.clear()    # 设置为False
ログイン後にコピー


以下がテストコードです:


a = Job()
a.start()
time.sleep(3)
a.pause()
time.sleep(3)
a.resume()
time.sleep(3)
a.pause()
time.sleep(2)
a.stop()
ログイン後にコピー


テスト結果:



Pythonスレッドの一時停止、再開、終了の詳しい説明と例
これで一時停止、再開、停止の機能は完了しましたが、ここには一時停止も停止もできないという欠点があります。停止は瞬時に行われ、実行関数内で待機する必要があります。つまり、実行がフラグに達したときにのみ有効です

しかし、実行関数が関係する場合、これは必ずしも悪いことではありません。ファイル操作やデータベース操作などを終了する前に、残りのリソース解放操作 (さまざまなクローズなど) のコードを実行できます。プログラムのファイル オペレーターが上限を超えるような厄介な状況は発生しません。制限があり、データベース接続が解放されません。

以上がPythonスレッドの一時停止、再開、終了の詳しい説明と例の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート
私たちについて 免責事項 Sitemap
PHP中国語ウェブサイト:福祉オンライン PHP トレーニング,PHP 学習者の迅速な成長を支援します!