我试图多次运行一个线程并继续收到错误:
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
消息。
该队列用于从data
函数(receive
)接收变量stop
。
答案 0 :(得分:1)
这是一个工作示例(对于python 2.7)。
该程序有两种操作模式:
请注意r.start()
中while循环之外如何调用r.terminate()
和client
。
另外,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()
答案 1 :(得分:0)
我认为问题是一旦线程启动,调用thread.start()会再次抛出错误。
使用try块可能只是一个简单的修复:
while True:
try:
r.start()
except Exception:
#or except RunTimeError:
pass
if q.get() == "stop":
print "Stopped"
break
print "Running program"