python线程中的无限循环

时间:2012-04-20 19:36:59

标签: python multithreading while-loop

即使服务器不接受我在客户端编写的函数后连接,我也会尝试从客户端到服务器端不断地进行连接

def run(self):

    print "running client"  
    start = datetime.now().second
    while True:
        try:
            host ='localhost'
            port = 5010
            time = abs(datetime.now().second-start)
            time = str(time)
            print time
            client = socket.socket()
            client.connect((host,port))
            client.send(time)

        except socket.error:
            pass 

现在我在另一个类中,它的名字是loginGui,我希望在一个线程的帮助下执行上面的全局函数运行,这样客户端就可以在我的其余客户端代码执行时不断向服务器端抛出时间。所以我在一个类中编写了以下代码 loginGui

class loginGui:
    def run_client(self):
            thread.start_new_thread(run,())

当我调用上面的函数run_client()时,线程运行但由于某些原因它从循环中出来并停止抛出时间所以我尝试了另一种方法..

class FuncThread(threading.Thread):

    def __init__(self, target, *args):
        self._target = target
        self._args = args
        threading.Thread.__init__(self)

    def run(self):
        self._target(*self._args)

我写了上面的类然后在run_client()函数中我做了以下更改..

def run_client(self):

    t1 = FuncThread(run,())
    t1.start()
    t1.join()

现在,当我调用run_client()时,它会创建一个线程并调用全局函数run(),但现在问题是它在while循环中被触发并继续浪费时间。

结论: 我基本上想要的是创建一个调用我的函数运行的线程并继续抛出时间而不会在循环中被触及..

1 个答案:

答案 0 :(得分:3)

在您的第一个示例中,您的while循环以非常快的未检查速率触发,一次又一次地创建未关闭的连接。你需要尝试在那里设置某种类型的限制,无论是睡眠,还是类似的东西。尝试重用相同的客户端而不是丢弃它们。它可能会遇到其他类型的异常,例如最终耗尽资源。如果您以前未能创建新客户端,则只需尝试创建新客户端。不只是每次你想发送另一部分数据。

在你的第二个例子中,除了将代码移动到实际的线程类之外,你做的几乎和以前一样,但是你调用join()将在主线程中阻塞,直到你的线程已经完成了。

简而言之,我不认为问题出在构建此线程类的地方,而是您如何以浪费的方式使用套接字连接。

这个例子有点难看,但我认为它会给你一个跳跃点:

import time

def run(self):

    print "running client"  
    start = datetime.now().second
    host ='localhost'
    port = 5010

    client = None

    while True:

        if client is None:
            client = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
            try:
                client.connect((host,port))
            except socket.error:
                print "Connection failed. Retrying."
                client = None
                time.sleep(.25)
                continue


        time = str(abs(datetime.now().second-start))
        print time
        try:
            client.sendall(time)
        except:
            print "Send error."
            client.close()
            client = None

        time.sleep(.25)