Heim  >  Artikel  >  Backend-Entwicklung  >  Ausführliche Erklärung und Beispiele für das Anhalten, Wiederaufnehmen und Beenden eines Python-Threads

Ausführliche Erklärung und Beispiele für das Anhalten, Wiederaufnehmen und Beenden eines Python-Threads

巴扎黑
巴扎黑Original
2017-03-30 14:22:093176Durchsuche

Python-Thread anhalten, fortsetzen, beenden

Wir alle wissen, dass das Threading-Modul in Python Multithreading implementieren kann, aber das Modul bietet keine Pause , Fortsetzen und Stoppen eines Threads: Sobald das Thread-Objekt die Startmethode aufruft, kann es nur warten, bis die entsprechende Methodenfunktion abgeschlossen ist. Mit anderen Worten, sobald der Thread gestartet ist, können wir dies selbst implementieren Die allgemeine Methode besteht darin, ein Flag-Bit zu bestimmen und die Schleife zu verlassen, sobald das Flag-Bit einen vorgegebenen Wert erreicht. Das Anhalten und Fortsetzen des Threads ist jedoch etwas schwierig Keine guten Methoden gefunden, bis ich die Beschreibung der Wartemethode des Event-Objekts im Threading sehe

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.



Verwendung des Blockierungsmechanismus von wait , Sie können anhalten und fortfahren und dann mit der Schleife zusammenarbeiten, um das Flag-Bit zu beurteilen. Das Folgende ist das Codebeispiel:

#!/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



Das Es folgt der Testcode:

a = Job()
a.start()
time.sleep(3)
a.pause()
time.sleep(3)
a.resume()
time.sleep(3)
a.pause()
time.sleep(2)
a.stop()



Testergebnisse:


Ausführliche Erklärung und Beispiele für das Anhalten, Wiederaufnehmen und Beenden eines Python-Threads

Dies ist abgeschlossen Die Funktionen „Pause“, „Fortsetzen“ und „Stopp“ haben jedoch einen Nachteil: Unabhängig davon, ob sie angehalten oder gestoppt ist, muss sie darauf warten, dass die Operation innerhalb der Ausführungsfunktion das Flag-Bit erreicht, bevor sie wirksam wird Mit anderen Worten, der Vorgang verzögert sich manchmal. Wenn die Ausführungsfunktion jedoch Dateivorgänge oder Datenbankvorgänge umfasst, können Sie sie ausführen Der verbleibende Code für Ressourcenfreigabevorgänge (z. B. verschiedene Schließungen) überschreitet die Obergrenze nicht. Peinliche Situationen wie die Nichtfreigabe der Datenbankverbindung.


Das obige ist der detaillierte Inhalt vonAusführliche Erklärung und Beispiele für das Anhalten, Wiederaufnehmen und Beenden eines Python-Threads. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn