并发:看起来像同时运行就是并发python
并行:同一时间同时被执行叫作并行,最大并行数就是CPU核数程序员
协程不是实实在在存在的物理基础和操做系统运行逻辑,只是程序员从代码层面避开了系统对遇到IO的程序会切走CPU资源的一种方法,在IO密集型任务中,经过协程,可让CPU尽量多的时间在本程序上执行,因为协程的原理是遇到IO及让cpu去执行其余代码,不停的来回切,在基于socket TCP通讯中,这便为并发提供了土壤,使得单线程也能实现并发多线程
下面咱们就来看下如何经过服务端开多线程和协程实现高并发并发
服务端:socket
import socket from multiprocessing import Process,current_process from gevent import monkey;monkey.patch_all() from gevent import spawn def frist(): s = spawn(task) # 遇到IO即切走执行其余线程 s.join() # 等待spawn走完再往下走 def task(): 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) while True: con, addr = server.accept() print(addr,"已链接") spawn(union,con) def union(con): while True: try: msg = con.recv(1024) print(msg.decode("utf-8")) con.send(msg.upper()) except BaseException: break con.close() if __name__ == '__main__': for i in range(1,50): p = Process(target=frist) # 开启50个进程 p.start()
每个进程都会在accept()和recv()处来回切换执行并死循环,这已经能够抗住必定的并发量高并发
而后开启了49个进程,也就是说复制了以上的49份执行单位,可想而知单台计算机可抗并发已经很是充分的利用到了cpu资源spa
下面看客户端代码:操作系统
import socket from threading import Thread,current_thread def task(): client = socket.socket() IP_port = ("192.168.11.161", 52334) client.connect(IP_port) while True: try: msg = current_thread() client.send(str(msg).encode("utf-8")) a = client.recv(1024) print("a",a.decode("utf-8")) except BaseException: break client.close() if __name__ == '__main__': for i in range(1,2000): s = Thread(target=task) s.start()
客户端开启了2000个线程模拟高并发,因为Cpython有全局解释器锁,这决定了同一进程的全部线程在同一时间只能有1个线程在用CPU资源,这虽然下降了每一个线程的执行频率,线程
但对于计算机来讲,2000个执行完仍是很是快的,模拟并发彻底能够。code
在以上的例子中,并发的效果并不能简单的看客户端访问量,而应该关注客户端每个线程访问两个周期间间隔的时长,若是线程1第一次执行完一次到下一次完整执行完一次的时间较长,那么这样的并发其实并无多大的参考价值。
给个赞呗~