python创建了两个模块进程,无法实现queue通信。

新手上路,请多包涵

这个程序设计通信图,如通信模型图展示的。
问题是:online_tcp_聊天模块和manager_new_tcp模块无法通过online_chat_queue的模块,实现多进程通信。
两者都可以自己正常独立进行运行,但是,另一个程序put进去queue中的消息,另外一个程序,无法取出。一直在堵塞
图片描述

文件一 online_tcp_聊天模块

import socket
import threading
import logging
import online_chat_queue

logging.basicConfig(level=logging.INFO, format="%(threadName)-10s %(message)s")

class OnlineChatModuleOne(object):

def __init__(self):
    # 主线程创建套接字,监听连接到来。
    self.tcp_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    # 设置地址复用
    self.tcp_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
    self.tcp_socket.bind(("127.0.0.1", 7890))
    self.tcp_socket.listen(128)
    self.th_sta = False


def run(self):
    while True:
        logging.info("进入循环,等待新的连接到来")
        new_client, new_addr = self.tcp_socket.accept()
        # 创建两个线程处理新的连接
        logging.info("已经有了新的连接")
        th_recv = threading.Thread(name="th_recv+%s" % str(new_addr), target=self.recv_msg, args=(new_client,))
        th_send = threading.Thread(name="th_send+%s" % str(new_addr), target=self.send_msg, args=(new_client,))
        # 启动两个线程
        self.th_sta = False
        th_recv.start()
        th_send.start()
        logging.info("开始了子线程,处理新的连接")


def recv_msg(self, new_socket):
    while True:
        logging.info("已经来到了处理接受线程的地方")
        recv_data = new_socket.recv(1024).decode("gbk")
        # if not recv_data:
        #     online_chat_queue.msg_son_2_par.put("0000")
        #     new_socket.close()
        #     self.th_sta=True
        #     break
        online_chat_queue.msg_son_2_par.put(recv_data)
        print(online_chat_queue.msg_son_2_par.qsize())


        logging.info("收到了消息,%s" % recv_data)
        # logging.info("recv_data\t %s" % online_chat_queue.msg_son_2_par.get())


def send_msg(self, new_socket):
    while True:
        logging.info("已经来到了处理发送消息的地方>")
        # send_data=input("%s请输入你要发送的消息:"%threading.currentThread).encode("utf-8")
        send_data = online_chat_queue.msg_par_2_son.get()
        logging.info("send_data%s" % send_data)
        new_socket.send(send_data.encode("utf-8"))
        logging.info("已经发送了消息。")
        if self.th_sta:
            break

def main():

# 创建对象,
onlinechat = OnlineChatModuleOne()


# 运行方法
onlinechat.run()

if name == '__main__':

main()



第二个模块 online_chat_queue
'''

这是每个进程进行通信采用的序列

'''
from multiprocessing import Queue

子进程发送收到的消息给父进程

msg_son_2_par = Queue()

主进程从网页获取的用户输入消息,发送给子进程

msg_par_2_son = Queue()

第三个模块 manager_new_tcp

作为tcp——socket 和 网页的中间管理zhe

import threading
import online_chat_queue
import logging
logging.basicConfig(level=logging.INFO,format=("%(threadName)-10s %(message)s"))
import time
import onLine_tcp_聊天
import multiprocessing

class ManagerOnlineQueue(object):

def run(self):
    #创建两个线程
    th_send=threading.Thread(target=self.send_queue)
    th_recv=threading.Thread(target=self.recv_queue)
    #启动两个线程
    th_recv.start()
    th_send.start()
    logging.info("两个线程启动成功")

def send_queue(self):
    while True:
        logging.info("给queue中发送消息的线程")
        send_data=input("请输入你要发送的消息")
        online_chat_queue.msg_par_2_son.put(send_data)
        logging.info("我已经把消息给了msg_par_2_son  %s " % send_data )



def recv_queue(self):
    while True:
        logging.info("我来到了接受消息的地方")


        logging.info("我是从儿子queue中获得新的消息")
        recv_data=online_chat_queue.msg_son_2_par.get()
        logging.info("我收到了你发送的消息.%s" % recv_data)

def main():

onlinech=onLine_tcp_聊天.OnlineChatModuleOne()
pro_onsocket=multiprocessing.Process(target=onlinech.run)
pro_onsocket.start()
manager=ManagerOnlineQueue()
manager.run()

if name == '__main__': main()

阅读 1.3k
撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题