zoukankan      html  css  js  c++  java
  • python----单线程实现并发之协程

    '''
    - 什么是协程?
    	协程有别于【多线程】、【多进程】,协程是指单线程实现并发的效果。一个线程里总是会存在I/O操作,此时操作系统检测到会自动将cpu执行权限分配给其他线程。
    而协程就是在一个线程里运行多个’子线程’,当其中的‘子线程’处于阻塞状态时会自动切换到另外一个‘子线程’。这样在CPU看来,我们这个程序就是一直处在运行的状态。
    
    - 为什么要使用协程?
    	协程可以节约内存,提高程序的运行效率。
    
    - 如何使用协程?
    	使用gevent模块,spawn,monkey。
    	monkey.patch_all() 猴子补丁,将监测所有I/O操作
    '''
    
    # 利用协程实现TCP服务端并发
    from gevent import monkey, spawn;monkey.patch_all()
    from threading import current_thread
    from socket import *
    
    def communicate(conn):
        print(f'子线程:{current_thread().getName()}')
        while True:
            try:
                data = conn.recv(1024)
                print(data)
                conn.send(data.upper())
            except:
                break
        conn.close()
    
    
    def server(ip, port):
        server = socket(AF_INET, SOCK_STREAM)
        server.bind((ip, port))
        server.listen(5)
        while True:
            conn, addr = server.accept()
            print(f'{addr}连接.....')
            spawn(communicate, conn)
            g.start()
    
    
    if __name__ == '__main__':
        g = spawn(server, '127.0.0.1', 9999)
        g.join()
    
    # 客户端
    from socket import *
    from threading import Thread,current_thread
    
    def run():
        client = socket(AF_INET, SOCK_STREAM)
        client.connect(
            ('127.0.0.1', 9999)
        )
        while True:
            client.send(f"hello i'm {current_thread().getName()}".encode('utf-8'))
            data = client.recv(1024)
            print(data.decode('utf-8'))
    
    
    if __name__ == '__main__':
        t_list = []
        for i in range(500):
            t = Thread(target=run, )
            t.start()
    
    
  • 相关阅读:
    Android 获取View在屏幕中的位置【转】
    算法学习资源 -- 2018年8月21日星期二
    Activity SingleInstance启动模式
    Android Studio添加aar依赖的两种方式
    Multiple dex files define Lcom/google/gson/internal/Streams$AppendableWriter$CurrentWrite;
    Android Studio添加aar依赖
    jdk-8u181-docs.chm -- 制作时间2018年8月12日
    大串中查找校串出现的次数(11)
    字符串反转(10)
    String类的替换方法(9)
  • 原文地址:https://www.cnblogs.com/Ghostant/p/12013204.html
Copyright © 2011-2022 走看看