python协程实现一万并发_python多进程单线程+协程实现高并发

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

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

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

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

服务端:

importsocketfrom multiprocessing importProcess,current_processfrom gevent importmonkey;monkey.patch_all()from gevent importspawndeffrist():

s= spawn(task) #遇到IO即切走执行其他线程

s.join() #等待spawn走完再往下走

deftask():

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)whileTrue:

con, addr=server.accept()print(addr,"已连接")

spawn(union,con)defunion(con):whileTrue:try:

msg= con.recv(1024)print(msg.decode("utf-8"))

con.send(msg.upper())exceptBaseException:breakcon.close()if __name__ == '__main__':for i in range(1,50):

p= Process(target=frist) #开启50个进程

p.start()

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

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

下面看客户端代码:

importsocketfrom threading importThread,current_threaddeftask():

client=socket.socket()

IP_port= ("192.168.11.161", 52334)

client.connect(IP_port)whileTrue:try:

msg=current_thread()

client.send(str(msg).encode("utf-8"))

a= client.recv(1024)print("a",a.decode("utf-8"))exceptBaseException:breakclient.close()if __name__ == '__main__':for i in range(1,2000):

s= Thread(target=task)

s.start()

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

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

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

给个赞呗~

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值