ホームページ  >  記事  >  バックエンド開発  >  Python スレッドの一時停止、再開、終了のサンプル コードの詳細な説明

Python スレッドの一時停止、再開、終了のサンプル コードの詳細な説明

高洛峰
高洛峰オリジナル
2017-03-23 17:19:032877ブラウズ

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线程的暂停, 恢复, 退出实例代码
これで一時停止、再開、停止の機能が完了します。ただし、ここには欠点があります。どちらも一時停止しないことです。停止も瞬時ではなく、実行関数内での操作を待つ必要があります。つまり、操作が一度遅れる場合があります。 run 関数にはファイル操作やデータベース操作などが含まれますが、終了する前に完全に実行しますが、プログラムのファイル演算子が上限を超えるなど、残りのリソース解放操作 (さまざまなクローズなど) を実行するコードが発生することはありません。制限、データベース接続が解放されていないなど。

読んでいただきありがとうございます。皆様のお役に立てれば幸いです。この記事のレビューをありがとうございます。サイト サポート!




-->

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

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