【问题标题】:Python threading giving global name not defined errorPython线程给出全局名称未定义错误
【发布时间】:2013-02-21 20:51:21
【问题描述】:

以下代码给出了全局名称未定义错误,但据我所见,名称 is 已定义。我是 Python 新手,这是范围问题吗?

import os, socket
from threading import Thread

class serv:
    def __init__(self):
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.socket.bind(('', 443))

    def run(self):
        self.socket.listen(10)
        print "Listening"
        self.conn, self.addr = self.socket.accept()
        try:
            Thread(target=clientThread, args=(self.conn,)).start()
        except Exception, errtxt:
            print errtxt

    def exit(self):
        print "Disconnected"
        self.conn.close()

    def clientThread(conn):
        print "Connected"
        while 1:
            conn.send("Hello, worlds!\n")

S = serv()
S.run()

具体错误是

global name 'clientThread' is not defined 

【问题讨论】:

  • pi 在 Raspberry Pi 出现之前是一个概念;请仅将pi 标记用于数学常数。 :-)

标签: python multithreading sockets raspberry-pi


【解决方案1】:

我会做出这些改变:

(1) 将self 传递给self.clientThread

def run(self):
    self.socket.listen(10)
    print "Listening"
    self.conn, self.addr = self.socket.accept()
    try:
        Thread(target=self.clientThread, args=(self,)).start()
    except Exception, errtxt:
        print errtxt

(2) 在clientThread中引用self

def clientThread(self):
    print "Connected"
    while 1:
        self.conn.send("Hello, worlds!\n")

另一种可能性是让您的对象从threading.Thread 派生而不是拥有一个线程。那么你的代码看起来更像这样:

import os, socket
from threading import Thread

class serv(Thread):
    def __init__(self):
        super(serv, self).__init__()
        self.socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.socket.bind(('', 443))

    def run(self):
        self.socket.listen(10)
        print "Listening"
        self.conn, self.addr = self.socket.accept()
        try:
            print "Connected"
            while 1:
                self.conn.send("Hello, worlds!\n")
        except Exception, errtxt:
            print errtxt

    def exit(self):
        print "Disconnected"
        self.conn.close()

S = serv()
S.start()

【讨论】:

    【解决方案2】:

    你应该使用

    self.clientThread
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-07-03
      • 1970-01-01
      • 2019-09-09
      • 2012-03-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      相关资源
      最近更新 更多