如何在python中多次运行一个线程

时间:2014-12-15 15:16:22

标签: python multithreading queue python-multithreading

我试图多次运行一个线程并继续收到错误:

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

2 个答案:

答案 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"