python----单线程实现并发之协程

SDUTACM 2019-12-09

'''
- 什么是协程?
    协程有别于【多线程】、【多进程】,协程是指单线程实现并发的效果。一个线程里总是会存在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()

相关推荐

fanhuasijin / 0评论 2019-12-17