首先我们了解一下线程和进程的概念和区别问题:

1. 进程: 通俗理解一个运行起来的程序或者软件叫做进程,而线程就是执行代码的分支
1.1 每启动进程都需要向操作系统索要运行资源(内存空间),进程是操作系统资源分配的基本单位, 只有进程把资源准备好了才能让线程执行对应的代码
1.2 默认情况下一个进程会提供一个线程(主线程),线程是依附在进程里面的,没有进程就没有线程,当然进程里面可以创建多个线程

1.3 如何理解进程: 把公司理解成进程,因为公司会提供办公资源(办公电脑,办公桌椅等),真正干活的是员工,员工可以理解成是线程


2. 进程和线程的对比 2.1 进程是操作系统资源分配的基本单位,线程是cpu调度的基本单位,提示:cpu调用某个线程,那么某个线程会执行对应的代码 2.2 先有进程,再线程,线程是依附在进程里面的,没有进程就没有线程,进程索要资源以后让线程执行对应的代码 2.3 默认一个进程会有一个线程,进程里面可以创建多个线程 2.4 进程之间不共享全局变量,但是线程之间共享全局变量,但是要注意资源竞争的问题,解决办法: 互斥锁或者线程同步 2.5 多进程开发比单进程多线程开发稳定性要强,因为某一个进程挂了不会影响其它进程的运行

2.6 多进程开发比单进程多线程开发资源要大,因为每启动一个进程都需要向操作系统索要运行资源,但是线程可以共享进程中的资源

首先贴出udp多任务聊天代码:

import threading
import socket
#发送数据功能
def send_msg(udp_socket, send_address):
    while True:
        send_msg = input("发送")
        udp_socket.sendto(send_msg.encode("utf-8"), send_address)
        if send_msg == "exit":
            break
#显示数据功能
def display_msg(udp_socket):
    while True:
        recv_data, ip_port = udp_socket.recvfrom(1024)
        if recv_data:
            print(recv_data.decode("utf-8"), "接收到到信息",ip_port)
if __name__ == "__main__":
    #创建udp套接字进行连接
    udp_socket = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    udp_socket.bind(("", 9090))
    send_address = ("192.168.243.130", 9090)
    #创建子线程执行数据发送功能
    send_msg_thread = threading.Thread(target=send_msg, args=(udp_socket, send_address))
    send_msg_thread.start()
    #主线程执行数据接收和展示功能
    display_msg(udp_socket)

执行多线程,只需要用到python里的threading模块,用threading模块里的类Thread创建一个线程,然后调用这个创建出来的对象的start()方法就可以执行他的target。

再贴出tcp多线程聊天服务器代码:

import socket
import threading
def recv_msg(client_socket, ip_port):
    while True:
        get_msg = client_socket.recv(1024)
        if get_msg:
            try:
                print(get_msg.decode("utf-8"), "消息来自", ip_port)
            except:
                print(get_msg.decode("gbk"), "消息来自", ip_port)
        else:
            print("客户端发送数据完成,并且下线了", ip_port)
            break
    client_socket.close()
if __name__ == "__main__":
    # 创建服务器端的socket用于监听
    tcp_serves_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
    tcp_serves_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, True)
    tcp_serves_socket.bind(("", 8080))
    tcp_serves_socket.listen(128)
    # 每次监听到的客户端socket进行一个线程的创建
    while True:
        client_socket, ip_port = tcp_serves_socket.accept()
        print("连接上的客户端是:", ip_port)
        # 创建一个主线程守护的子线程来执行接收打印数据
        recv_msg_thread = threading.Thread(target=recv_msg, args=(client_socket, ip_port), daemon=True)
        recv_msg_thread.start()
                    上一次贴出我写的单线程聊天服务器,单线程在服务器上肯定是不能满足需求的,这一次写个多线程的框架,下回再写多进程的把首先我们了解一下线程和进程的概念和区别问题:1. 进程: 通俗理解一个运行起来的程序或者软件叫做进程,而线程就是执行代码的分支	1.1 每启动进程都需要向操作系统索要运行资源(内存空间),进程是操作系统资源分配的基本单位, 只有进程把资源准备好了才能让线程执行对应的代码	1.2 默认情...
				
本文研究的主要是Python编程scoketServer实现多线程同步的相关内容,具体介绍如下。 开发过程中,为了实现不同的客户端同一时刻只能有一个使用共同数据。 虽说用Python编写简单的网络程序很方便,但复杂一点的网络程序还是用现成的框架比较好。这样就可以专心事务逻辑,而不是套接字的各种细节。SocketServer模块简化了编写网络服务程序的任务。同时SocketServer模块也是Python标准库中很多服务器框架的基础。 网络服务类: SocketServer提供了4个基本的服务类: TCPServer针对TCP套接字流 UDPServer针对UDP数据报套接字 UnixSt
MAX_BYTES = 65535 def udpChatre(selfip,selfPort): sock = socket.socket( socket.AF_INET,socket.SOCK_DGRAM) sock.bind(( selfip, selfPort)) print('UDP聊天程序启动监听地址为:{}'.format(soc 多线程可以实现同时响应多个客户端连接,避免阻塞。可以使用Python的threading模块或者concurrent.futures模块实现多线程。 2. 网络编程 机器人需要通过网络与客户端进行通讯,可以使用Python的socket模块实现。 3. 语言模型 机器人需要进行自然语言处理,可以使用Python的Natural Language Toolkit (NLTK)或者PyTorch等库。 有一些已经开发好的Python库可以使用,如ChatterBot、Dialogflow等。 实现思路: - 通过socket模块实现服务器和客户端的连接和通讯。 - 服务器通过多线程同时响应多个客户端连接请求。 - 使用语言模型对客户端的消息进行分析和回复。 - 可以添加一些规则和条件,如关键词匹配、回复策略等,让机器人的对话更加自然和流畅。 最后再次强调,由于该项目功能复杂、代码量大,如果您没有相关的编程经验,建议先学习Python的基础语法和网络编程知识,然后再尝试实现该项目。 CSDN-Ada助手: 非常感谢您写下这篇博客,解决了使用谷歌内核webview定位失败的问题。我们希望您能持续地分享关于移动开发的经验和技巧,特别是涉及到定位方面的知识。我们建议您可以写一篇博客,介绍如何使用高德地图API实现地图定位功能,或者分享一些优化定位效果的技巧和经验。期待您的下一篇博客! 为了方便博主创作,提高生产力,CSDN上线了AI写作助手功能,就在创作编辑器右侧哦~(https://mp.csdn.net/edit?utm_source=blog_comment_recall )诚邀您来加入测评,到此(https://activity.csdn.net/creatActivity?id=10450&utm_source=blog_comment_recall)发布测评文章即可获得「话题勋章」,同时还有机会拿定制奖牌。 谷歌浏览器,安卓内嵌谷歌内核webview使用高德JSAPI定位失败的问题解决! MMMei_: 求助:怎么联系到高德的工作人员的 js的Map和Object对比 fictiony: 关于用法对比里的新增键覆盖原型键的问题,比较的方法不是很正确,毕竟Map对象设值和取值要用set和get方法,直接用.符号是取不到Map里的键值的,用.符号来读写相当于是把它当做普通对象来操作其变量空间 Mac 系统中各个文件夹详细介绍 weixin_43490520: 赞,正好需要了解一下这方面的 DRF视图和视图集 qq_52394626: 这篇文章写的太好了表情包