【问题标题】:How to run a thread more than once in python如何在python中多次运行一个线程
【发布时间】:2014-12-15 15:16:21
【问题描述】:

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

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

【问题讨论】:

  • 你经常打电话给r.start()?因为如果没有收到消息,您的q.get() 将返回None(或者它可能是一个阻塞函数,不确定?)并且您的代码将尝试再次启动线程,即使第一个实例仍在运行。
  • @Lawrence 我试图通过在 while 循环结束时停止线程或创建另一个线程实例来克服这个问题,我不确定该怎么做。
  • threading 模块没有名为thread 的属性,因此您应该从threading.thread(target=receive, args=(q,)) 语句中获得AttributeError
  • @martineau 打错了,用大写字母 thread 和大写字母 T,Thread 更正。这应该返回RuntimeError

标签: python multithreading queue python-multithreading


【解决方案1】:

这是一个工作示例(适用于 python 2.7)。

程序有两种操作模式:

  • 不带参数运行接收循环
  • 使用参数发送数据报

注意r.start()r.terminate()client 的while 循环之外是如何被调用的。 此外,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()

【讨论】:

  • 这很好用。但是,如果我要收到多条消息怎么办。所以发送的第一条消息是start,然后它会循环执行某些操作,直到发送stop。我稍微修改了您的代码并添加了我上面提到的内容:while True: m = q.get() print "got:", m while m == "start": print "started" z = q.get() if z == "stop": return@user5402
  • 如果您将其作为另一个 SO 问题发布,我可以回答。篇幅太小,无法详细回答。
  • 可以查看新问题here@user5402
  • 这会返回 error: [Errno 98] Address already in use 并且不起作用.. @user5402
【解决方案2】:

我认为问题是一旦线程启动,再次调用 thread.start() 就会抛出错误。

使用 try 块可以作为一个简单的解决方法:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-10-24
    • 2019-10-30
    • 2017-07-05
    • 1970-01-01
    • 2022-11-26
    • 2011-07-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多