如何使用线程和队列处理聊天客户端?

时间:2013-03-08 15:19:58

标签: python multithreading chat

我现在遇到的问题是关于这个聊天客户端的问题,我一直试图让它工作几天。它应该是我原始聊天客户端的升级,如果它首先收到消息,则只能回复人。

所以在询问并研究人员后,我决定使用select.select来处理我的客户。

问题是它始终存在同样的问题。

* 循环在接收时停滞不前,直到收到内容后才会完成 *

这是我到目前为止所写的内容:

import select
import sys #because why not?
import threading
import queue

print("New Chat Client Using Select Module")

HOST = input("Host: ")
PORT = int(input("Port: "))

s = socket(AF_INET,SOCK_STREAM)

print("Trying to connect....")
s.connect((HOST,PORT))
s.setblocking(0)
# Not including setblocking(0) because select handles that. 
print("You just connected to",HOST,)

# Lets now try to handle the client a different way!

while True:
    #     Attempting to create a few threads
    Reading_Thread = threading.Thread(None,s)
    Reading_Thread.start()
    Writing_Thread = threading.Thread()
    Writing_Thread.start()



    Incoming_data = [s]
    Exportable_data = []

    Exceptions = []
    User_input = input("Your message: ")

    rlist,wlist,xlist = select.select(Incoming_data,Exportable_data,Exceptions)

    if User_input == True:
        Exportable_data += [User_input]

你可能想知道为什么我在那里有线程和队列。

那是因为人们告诉我,我可以通过使用线程和队列解决问题,但在阅读文档后,寻找符合我案例的视频教程或示例。我仍然不知道如何使用它们来使我的客户工作。

有人可以帮帮我吗?我只需要找到一种方法让客户端尽可能多地输入消息而无需等待回复。这只是我尝试这样做的方法之一。

1 个答案:

答案 0 :(得分:1)

通常你会创建一个函数,在这个函数中While True循环运行并且可以接收数据,它可以写入主线程可以访问的某个缓冲区或队列。

您需要同步对此队列的访问权限,以避免数据争用。

我不太熟悉Python的线程API,但是创建一个在线程中运行的函数不会那么难。 Lemme找到了一个例子。

事实证明,您可以使用函数创建一个类,其中类派生自threading.Thread。然后你可以创建你的类的实例并以这种方式启动线程。

class WorkerThread(threading.Thread):

    def run(self):
        while True:
            print 'Working hard'
            time.sleep(0.5)

def runstuff():
    worker = WorkerThread()
    worker.start() #start thread here, which will call run()

您还可以使用更简单的API并创建一个函数并在其上调用thread.start_new_thread(fun, args),它将在一个线程中运行该函数。

def fun():
    While True:
        #do stuff

thread.start_new_thread(fun) #run in thread.