Heim  >  Artikel  >  Backend-Entwicklung  >  Detaillierte Erläuterung des Beispielcodes zum Anhalten, Fortsetzen und Beenden des Python-Threads

Detaillierte Erläuterung des Beispielcodes zum Anhalten, Fortsetzen und Beenden des Python-Threads

高洛峰
高洛峰Original
2017-03-23 17:19:032851Durchsuche

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 Folgende ist das 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:


详解python线程的暂停, 恢复, 退出实例代码

Damit sind die Funktionen Pause und Fortsetzen abgeschlossen und stoppen. Hier gibt es jedoch einen Nachteil: Unabhängig davon, ob es angehalten oder angehalten wird, muss gewartet werden, bis die Operation innerhalb der Ausführungsfunktion die Flag-Beurteilung erreicht
Dies ist jedoch manchmal nicht unbedingt eine schlechte Sache. Wenn die Ausführungsfunktion Dateivorgänge oder Datenbankvorgänge usw. umfasst und nach vollständiger Ausführung beendet wird, kann stattdessen der Code für die verbleibenden Ressourcenfreigabevorgänge (z. B. verschiedene) ausgeführt werden wird geschlossen). Es wird keine Peinlichkeiten geben, wie zum Beispiel, dass die Dateioperatoren des Programms die Obergrenze überschreiten und die Datenbankverbindung nicht freigegeben wird.

Vielen Dank fürs Lesen, ich hoffe, es kann allen helfen, vielen Dank für Ihre Unterstützung dieser Seite!


Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung des Beispielcodes zum Anhalten, Fortsetzen und Beenden des 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