'''
- 什么是协程?
协程有别于【多线程】、【多进程】,协程是指单线程实现并发的效果。一个线程里总是会存在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()
原文地址:https://www.cnblogs.com/Ghostant/p/12013204.html
时间: 2024-10-11 18:37:30