标题:求助,主线程开启副线程的问题
只看楼主
zxq0103
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2023-3-10
结帖率:0
 问题点数:0 回复次数:5 
求助,主线程开启副线程的问题
程序代码:
from socket import *
import os,sys
from multiprocessing import Process

"""
    UDP客户端
    协议:
        L:登陆
        C:聊天
        Q:退出
"""

ADDR = ('127.0.0.1',8888)
s = socket(AF_INET,SOCK_DGRAM)

def main():
    while True:
        name = input('请输入姓名>>')
        msg = 'L ' + name
        # 发送信息
        s.sendto(msg.encode(),ADDR)
        # 接收信息
        data,addr = s.recvfrom(128)
        print('收到信息:',data.decode())

        if data.decode() == 'OK':
            print('你已经入进聊天室',) # 下面如何开启副线程能进入到收消息函数,且不影响主线程下面的发消息
            p1 = Process(target=to_recv,name='收消息',args=(name,)) # 监听收消息
            p1.start()
            print(p1.name,p1.pid)
            to_send(name)
            #to_recv(name)
            return
        else:
            print(data.decode())

def to_recv(name): #收消息
    while True:
        data,addr = s.recvfrom(128)
        tmp = data.decode().split(' `')
        print(tmp[1])

def to_send(name): # 发消息
    while True:
        msg = input(name+"[q退出]>>")
        if msg == 'q':
            msg = 'Q '+name
            s.sendto(msg.encode(),ADDR)
            sys.exit()
        else:
            msg = 'C '+name+' '+ msg
            s.sendto(msg.encode(),ADDR)
        

main()

请问,在上面进入聊天室后,如何能开启副线程去到收信息的函数里,下面发信息是主线程要运行的

[此贴子已经被作者于2023-4-14 23:43编辑过]

搜索更多相关主题的帖子: data 线程 消息 name ADDR 
2023-04-14 23:40
东海ECS
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:Python
等 级:版主
威 望:19
帖 子:376
专家分:1454
注 册:2023-1-24
得分:0 
可以将收消息和发消息放到同一个进程中,这样就可以在进入聊天室后开启一个子进程来执行收消息和发消息的功能,不会影响主线程的执行。具体实现如下:

程序代码:
from socket import * import os,sys from multiprocessing import Process

""" UDP客户端 协议: L:登陆 C:聊天 Q:退出 """

ADDR = ('127.0.0.1',8888) s = socket(AF_INET,SOCK_DGRAM)

def main(): while True: name = input('请输入姓名>>') msg = 'L ' + name # 发送信息 s.sendto(msg.encode(),ADDR) # 接收信息 data,addr = s.recvfrom(128) print('收到信息:',data.decode())

    if data.decode() == 'OK':
        print('你已经入进聊天室')

        # 开启一个子进程执行收消息和发消息
        p1 = Process(target=chatting,name='聊天',args=(name,))
        p1.start()
        print(p1.name,p1.pid)

        return
    else:
        print(data.decode())
def chatting(name): # 发消息的函数 def to_send(): while True: msg = input(name+"[q退出]>>") if msg == 'q': msg = 'Q '+name s.sendto(msg.encode(),ADDR) sys.exit() else: msg = 'C '+name+' '+ msg s.sendto(msg.encode(),ADDR)

# 收消息的函数
def to_recv():
    while True:
        data,addr = s.recvfrom(128)
        tmp = data.decode().split(' `')
        print(tmp[1])

# 开启两个线程并启动,使用join()保证子进程在主进程退出前执行完毕
p_send = Process(target=to_send)
p_recv = Process(target=to_recv)
p_send.start()
p_recv.start()
p_send.join()
p_recv.join()
main()

会当凌绝顶,一览众山小.
2023-04-15 09:29
zxq0103
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2023-3-10
得分:0 
回复 2楼 东海ECS
vscode下运行不了啊
2023-04-15 13:53
东海ECS
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:Python
等 级:版主
威 望:19
帖 子:376
专家分:1454
注 册:2023-1-24
得分:0 
可能存在的问题:

处理数据时可能会出现空字符异常

在多进程处理发送和接收信息时,需要使用套接字锁,避免数据混乱

键盘输入和打印输出在 Windows 和 Linux 上有所区别,可能需要在 Windows 上修改。

需要在服务器端编写相应的代码以进行服务端的交互,目前代码只提供了客户端的实现。

在消息发送之后没有进行实际的判断,可能会导致程序陷入死循环。

需要注意这些问题,并在运行前根据实际情况进行修改。




会当凌绝顶,一览众山小.
2023-04-15 13:59
东海ECS
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
来 自:Python
等 级:版主
威 望:19
帖 子:376
专家分:1454
注 册:2023-1-24
得分:0 
抱歉,您可以给出错误提示

会当凌绝顶,一览众山小.
2023-04-15 13:59
zxq0103
Rank: 1
等 级:新手上路
帖 子:36
专家分:0
注 册:2023-3-10
得分:0 
回复 5楼 东海ECS
我在VSCODE里始终不能实现进程收发UDP的消息,
进程不能用input,现在我改成线程了,
已经解决问题了.我是在用UDP模拟聊天室,

[此贴子已经被作者于2023-4-16 00:00编辑过]

2023-04-15 23:58



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-511912-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.052289 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved