• python多进程单线程+协程实现高并发


    并发:看起来像同时运行就是并发

    并行:同一时间同时被执行叫做并行,最大并行数就是CPU核数

    协程不是实实在在存在的物理基础和操作系统运行逻辑,只是程序员从代码层面避开了系统对遇到IO的程序会切走CPU资源的一种方法,在IO密集型任务中,通过协程,可以让CPU尽可能多的时间在本程序上执行,由于协程的原理是遇到IO及让cpu去执行其他代码,不停的来回切,在基于socket TCP通信中,这便为并发提供了土壤,使得单线程也能实现并发

    下面我们就来看下如何通过服务端开多线程和协程实现高并发

    服务端:

    import socket
    from multiprocessing import Process,current_process
    from gevent import monkey;monkey.patch_all()
    from gevent import spawn
    def frist():
        s = spawn(task)      # 遇到IO即切走执行其他线程
        s.join()     # 等待spawn走完再往下走
    
    def task():
        server = socket.socket()
        server.setsockopt(socket.SOL_SOCKET,socket.SO_REUSEADDR,1)
        IP_port = ("127.0.0.1",52334)
        server.bind(IP_port)
        server.listen(5)
        while True:
            con, addr = server.accept()
            print(addr,"已连接")
            spawn(union,con)
    
    def union(con):
        while True:
            try:
                msg = con.recv(1024)
                print(msg.decode("utf-8"))
                con.send(msg.upper())
            except BaseException:
                break
        con.close()
    
    if __name__ == '__main__':
        for i in range(1,50):
            p = Process(target=frist)  # 开启50个进程
            p.start()

    每一个进程都会在accept()和recv()处来回切换执行并死循环,这已经可以抗住一定的并发量

    然后开启了49个进程,也就是说复制了以上的49份执行单位,可想而知单台计算机可抗并发已经非常充分的利用到了cpu资源

    下面看客户端代码:

    import socket
    from threading import Thread,current_thread
    
    def task():
        client = socket.socket()
        IP_port = ("192.168.11.161", 52334)
        client.connect(IP_port)
        while True:
            try:
                msg = current_thread()
                client.send(str(msg).encode("utf-8"))
                a = client.recv(1024)
                print("a",a.decode("utf-8"))
            except BaseException:
                break
        client.close()
    
    if __name__ == '__main__':
        for i in range(1,2000):
            s = Thread(target=task)
            s.start()

    客户端开启了2000个线程模拟高并发,由于Cpython有全局解释器锁,这决定了同一进程的所有线程在同一时间只能有1个线程在用CPU资源,这虽然降低了每个线程的执行频率,

    但对于计算机来说,2000个执行完还是非常快的,模拟并发完全可以。

    在以上的例子中,并发的效果并不能简单的看客户端访问量,而应该关注客户端每一个线程访问两个周期间间隔的时长,如果线程1第一次执行完一次到下一次完整执行完一次的时间较长,那么这样的并发其实并没有多大的参考价值。

    给个赞呗~

  • 相关阅读:
    复数除法
    base operand of '->' has non-pointer type 'const Comple
    virtual关键字
    & 引用
    const用法
    Iptable与firewalld防火墙
    存储结构与磁盘划分
    Linux系统中用户身份与文件权限
    计时器小程序——由浅入深实例讲解
    ASP.NET编程十大技巧(他人总结)
  • 原文地址:https://www.cnblogs.com/dongxixi/p/10842201.html
Copyright © 2020-2023  润新知