看了这篇关于 GUI 情景中的 socket 编程的文章 http://www.jianshu.com/p/731a8359c2c5
然后仿照着按照自己的业务逻辑去做,出现了以下的问题。
现在有两个线程一个队列,一个线程负责入队,一个负责出队。 每个线程都是 1s 进行一次操作。 但是负责入队的线程经常会阻塞,就像阻塞了几秒,一下子入队好几次。
以下的代码都是关于队列cmd_q的
入队相关的代码
def send_heartbeat(self, receive_dic=None): # 转换为连接状态 self.api_manager.socket_is_cOnnect= True # 开始发送心跳 self.heartbeat_thread = threading.Thread(target=self.__send_heartbeat_timer) self.heartbeat_thread.start() def __send_heartbeat_timer(self): while self.api_manager.socket_is_connect: print("%s !!!!!!!!!!!!!put command start!!!!!" % time.asctime(time.localtime(time.time()))) self.api_manager.client.cmd_q.put(ClientCommand(ClientCommand.SEND, "heartbeat")) print("%s !!!!!!!!!!!!!put command end!!!!!" % time.asctime(time.localtime(time.time()))) logging.info("time: %s send bearheart", time.asctime(time.localtime(time.time()))) time.sleep(4) 出队相关的代码
def run(self): while self.alive.isSet(): try: # Queue.get with timeout to allow checking self.alive # print("%s !!!!!!!!!!!!!get command!!!!!" % time.asctime(time.localtime(time.time()))) print("%s !!!!!!!!!!!!!get command start!!!!!" % time.asctime(time.localtime(time.time()))) cmd = self.cmd_q.get(True, 1) if (cmd.data == "heartbeat"): print("%s !!!!!!!!!!!!!get command end!!!!!" % time.asctime(time.localtime(time.time()))) handler = self.handlers[cmd.type] handler(cmd) except queue.Empty as e: continue 