Python线程,为什么我只能启动一次线程?

时间:2015-01-25 12:44:06

标签: python multithreading

我在网络设备上有一个简单的看门狗脚本。脚本监视来自PING命令的响应。如果没有答案,则执行第二个线程并停止第一个线程。如果第二个线程完成,则恢复第一个线程(检查ping)。如果没有答案,则会出现以下消息:RuntimeError:thread只能启动一次

    #!/usr/bin/python

    import os
    import time
    import sqlite3
    from ablib import Pin
    import threading

    led=Pin('W9','OUTPUT')

    class threadout1(threading.Thread):
      def run(self):
        while True:
            conn = sqlite3.connect('database/database.db')
            cur = conn.cursor()
            cur.execute("SELECT * FROM watchdog")
            rows_output = cur.fetchall()
            time.sleep(1)

            if rows_output[0][1] == "ping":
                response = os.system("ping -c 1 " + rows_output[0][2])
                if response != 0:
                    print "bad"
                    rest.start()
                    rest.join()     

    class restart(threading.Thread):
      def run(self):
        led.on()
        time.sleep(15)
        led.off()

    thr = threadout1()
    rest = restart()
    thr.start()

1 个答案:

答案 0 :(得分:4)

您可以在每次需要时创建restart主题

if response != 0:
print "bad"
restart_thread = restart()
restart_thread.start()
restart_thread.join()

或使用Events

class restart_thread(threading.Thread):
  def __init__(self, evt):
    self.evt = evt

  def run(self):
    self.evt.wait()
    # do stuff
    self.evt.clear()

class threadout(threading.Thread):
  def __init__(self, evt):
    self.evt = evt

  def run(self):
    if #other thread needs to run once
      self.evt.set()

evt = threading.Event()
restart_thread = restart(evt)
restart_thread.start()
pinging_thread = threadout(evt)
pinging_thread.start()

要让pinging_thread等待restart_thread完成,您可以使用其他活动。