簡體   English   中英

如何在python中多次運行線程

[英]How to run a thread more than once in python

我試圖多次運行一個線程並不斷出現錯誤:

RuntimeError: threads can only be started once

我嘗試讀取多線程並在我的代碼中實現它,但是沒有任何運氣。

這是我正在線程化的函數:

def receive(q):
    host = ""
    port = 13000
    buf = 1024
    addr = (host,port)
    Sock = socket(AF_INET, SOCK_DGRAM)
    Sock.bind(addr)
    (data, addr) = Sock.recvfrom(buf)
    q.put(data)

這是我要運行的代碼:

q = Queue.Queue()
r = threading.Thread(target=receive, args=(q,))

while True:
    r.start()
    if q.get() == "stop":
        print "Stopped"
        break
    print "Running program"

發送stop消息后,該程序應退出while循環,但由於多線程而無法運行。 while循環應不斷打印出正在Running program ,直到發送stop消息為止。

該隊列用於從receive函數(這是stop )接收變量data

這是一個工作示例(適用於python 2.7)。

該程序具有兩種操作模式:

  • 沒有參數,它將運行接收循環
  • 與參數一起發送數據報

注意如何在client的while循環之外調用r.start()r.terminate() 另外, receive具有while True循環。

import sys
import socket
from multiprocessing import Process, Queue

UDP_ADDR = ("", 13000)

def send(m):
    sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) 
    sock.sendto(m, UDP_ADDR)

def receive(q):
    buf = 1024
    Sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    Sock.bind(UDP_ADDR)
    while True:
      (data, addr) = Sock.recvfrom(buf)
      q.put(data)

def client():
  q = Queue()
  r = Process(target = receive, args=(q,))
  r.start()

  print "client loop started"
  while True:
      m = q.get()
      print "got:", m
      if m == "stop":
          break
  print "loop ended"

  r.terminate()

if __name__ == '__main__':
  args = sys.argv
  if len(args) > 1:
    send(args[1])
  else:
    client()

我認為問題在於線程啟動后,再次調用thread.start()會引發錯誤。

使用try塊可能會很簡單:

 while True: try: r.start() except Exception: #or except RunTimeError: pass if q.get() == "stop": print "Stopped" break print "Running program" 

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM