[英]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.