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

时间:2016-05-26 13:45:38

标签: python multithreading python-2.7 class sockets

所以,我一直有这个问题,无论如何,似乎无法解决它。

使用多线程时,我可以 - 简单地不让这些类相互通信。

是的,我有一些非常难看的代码来支持我的说法。

在这种情况下,我将使用来自小代理的代码作为示例。

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

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,或者由于时间和空间不足,Class 2读取文件。如果文件中没有数据,它会尝试获取一些数据并将其放在HandleInbound中,或者将第1类读取。

Class 2完成了它的工作,而Class 1在发送讨价还价的数据部分时变得懒惰,后来甚至没有注意到文件和代码在那里,但是,它确实有时间写2GB日志文件"非阻塞错误"在5分钟内到我的电脑,我需要弄清楚是什么以及为什么。

我以前,并且总是首先尝试不同程度的成功全局变量。今天它没有那个。

我还尝试直接从1级到2级进行沟通,甚至使用布尔,但我的运气技巧已经用完了。

我多次重写了Class 1。首先看看是否隐藏了某些东西。没变。然后以相同或尽可能接近的方式匹配到第2类。我最终还要对事物进行C / P并重命名变量。

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

似乎很少或根本没有初学者或中级指南或文件可以解决这个问题,因为我一直在寻找一段时间,因为在多年的时间里我一直在考虑这个问题"只是google it"。

日志和控制台除了&#34之外没有任何帮助;非阻塞套接字操作无法立即完成"。

我知道代码很糟糕,风格很草率,而且支离破碎,但理论上它应该无论如何都能正常工作,或者不断地使用不同级别,正确​​吗?

0 个答案:

没有答案