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() 相关推荐
efeve 2020-09-14
ericxieforever 2020-09-03
Dimples 2020-06-08
鲁鲁酱 2020-06-02
feishicheng 2020-05-31
paopao00 2020-05-10
georgeandgeorge 2020-05-09
Greatemperor 2020-05-03
jacktangj 2020-04-17
CloudXli 2020-04-07
oXiaoChong 2020-04-07
学习备忘录 2020-02-18
wyqwilliam 2020-02-10
PythonMaker 2020-01-19
ddxygq 2019-12-30
shengge0 2019-12-26
sschencn 2019-12-19
千锋 2019-12-07
Laozizuiku 2019-12-04
mayflowers 2019-11-18
wklken的笔记 2019-11-01