Python:多线程类之间的通信错误

2024-06-23 19:20:46 发布

您现在位置:Python中文网/ 问答频道 /正文

所以,我一直都有这个问题,不管怎样,似乎都解决不了

当使用多线程时,我无法让类彼此通信

是的,我有一些非常丑陋的代码来支持我的主张

在本例中,我将使用来自小型代理的代码作为示例

此类处理从服务器到被截获的客户端的数据

class HandleInbound(threading.Thread):

    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        global ftwn
        self.dsi.connect(('208.95.184.130',7255))
        self.dsi.setblocking(0)
        while True:
            try:
                f = open('odat.tmp','r+')
                a = f.read()
                if len(a) != 0:
                    self.dsi.send(open('odat.tmp').read())
                    open('odat.tmp','w').write("")
                dat = self.dsi.recv(65356)
                open('idat.tmp','w').write(dat)
                udat = dat.encode("hex")
                Log(udat, 0, ftwn)

            except socket.timeout:
                print("DSI Timedout")
            except socket.error as e:
                Log(e, 2, ftwn)
            except Exception as e:
                raise
                print("In;",e)
                self.dsi.close()
                sys.exit()

这是我的问题课。记住这一点

这一个按预期工作,处理从客户端到服务器的流量

class HandleOutbound(threading.Thread):

    def __init__(self):
        threading.Thread.__init__(self)

    def run(self):
        global conn, addr, ftwn
        print("Client connected from {}.".format(addr))
        conn.setblocking(0)
        while True:
            try:
                f = open('idat.tmp','r+')
                a = f.read()
                if len(a) != 0:
                    conn.send(open('idat.tmp').read())
                    open('idat.tmp','w').write("")
                dat = conn.recv(65356)
                open('odat.tmp','w').write(dat)
                udat = dat.encode("hex")
                Log(udat, 0, ftwn)

            except socket.timeout:
                print("Conn Timedout")
            except socket.error as e:
                Log(e, 2, ftwn)
            except Exception as e:
                print("Out;",e)
                conn.close()
                sys.exit()

如您所见,当前的通信形式是通过临时文件进行的

HandleOutbound,或者由于缺少时间和空间,类2读取文件。如果文件中没有数据,它会尝试获取一些数据并将其放在那里,以便HandleInBond或类1读取

类2完成了它的工作,类1在发送交易的数据部分时变得懒惰,后来甚至没有注意到文件和代码在那里,但是,它确实有时间在5分钟内将2GB的“非阻塞错误”日志文件写入我的计算机,我需要弄清楚是什么和为什么

我以前,而且总是先尝试,取得不同程度的成功,有全局变量。今天,它一点也没有

我还试图直接从一班到二班交流,甚至使用布尔语,但我的运气技能已经用完了

我已经多次重写了第1课。首先看看是否有什么东西被隐藏了。没有变化。然后以相同的方式或尽可能接近的方式匹配到类2。我最终也对该对象进行了C/P,并重命名了变量

至少我有一致的结果-没有变化

似乎也很少或根本没有初学者或中级指南或文档来解决这个问题,因为我已经寻找了一段时间,因为多年来我一直牢记,我不能“仅仅用谷歌搜索它”

除了“非阻塞套接字操作无法立即完成”之外,日志和控制台没有留下任何帮助

我知道代码很糟糕,样式很邋遢,而且支离破碎,但从理论上讲,不管怎样,它都应该工作,或者不断地抛出一系列不同的级别,对吗


Tags: 数据代码selfinitdefopenconnthread

热门问题