python单线程下实现多个socket并发过程详解
先看服务端的代码
importsys #importsocket importtime importgevent fromgeventimportsocket fromgeventimportmonkey monkey.patch_all() #类似于python中的黑魔法,把很多模块的阻塞的变成非阻塞的,比如socket中的rece和send都变 #为不阻塞了 defserver(port): s=socket.socket() s.bind(("127.0.0.1",port)) s.listen(2000) whileTrue: cli,add=s.accept() gevent.spawn(handle_request,cli) #通过gevent的启动一个协程,把客户端的socket对象传进去 defhandle_request(s): try: whileTrue: data=s.recv(1024) print("收到的信息:",str(data,encoding="utf-8")) s.send(data) ifnotdata: s.shutdown(socket.SHUT_WR) #把和客户端这个链接销毁 exceptExceptionasex: print(ex) finally: s.close() if__name__=='__main__': server(8000)
在看客户端的代码,分别使用多线程和多进程实现
importsocket importgevent importthreading importmultiprocessing ''' ip_bind=("127.0.0.1",8000) c=socket.socket() c.connect(ip_bind) whileTrue: data=input("客户端:") c.send(bytes(data,encoding="utf-8")) data=c.recv(1024) print("服务端:",str(data,encoding="utf-8")) c.close() ''' importsocket importgevent ip_bind=("127.0.0.1",8000) c=socket.socket() c.connect(ip_bind) deff(n): whileTrue: #c.send(bytes(n,encoding="utf-8")) data=str(n) c.send(bytes(data,encoding="utf-8")) data=c.recv(1024) print("server:",str(data,encoding="utf-8")) c.close() x=[] if__name__=='__main__': l=[] """ 多线程实现并发客户端 foriinrange(500): t=threading.Thread(target=f,args=[str(i),]) t.start() l.append(t) fortinl: t.join() """ #多进程实现并发客户端 foriinrange(100): p=multiprocessing.Process(target=f,args=[i,]) p.start() l.append(p) forpinl: p.join()
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。