首页 > 编程 > Python > 正文

python单线程下实现多个socket并发过程详解

2019-11-25 12:12:31
字体:
来源:转载
供稿:网友

先看服务端的代码

import sys# import socketimport timeimport geventfrom gevent import socketfrom gevent import monkeymonkey.patch_all()#类似于python中的黑魔法,把很多模块的阻塞的变成非阻塞的,比如socket中的rece和send都变# 为不阻塞了  def server(port):  s = socket.socket()  s.bind(("127.0.0.1",port))  s.listen(2000)  while True:    cli,add = s.accept()    gevent.spawn(handle_request,cli)    #通过gevent的启动一个协程,把客户端的socket对象传进去def handle_request(s):  try:    while True:      data = s.recv(1024)      print("收到的信息:",str(data,encoding="utf-8"))      s.send(data)      if not data:        s.shutdown(socket.SHUT_WR)        #把和客户端这个链接销毁  except Exception as ex:    print(ex)  finally:    s.close() if __name__ == '__main__':  server(8000)

在看客户端的代码,分别使用多线程和多进程实现

import socketimport geventimport threadingimport multiprocessing'''ip_bind = ("127.0.0.1",8000)c = socket.socket()c.connect(ip_bind)while True:  data = input("客户端:")  c.send(bytes(data,encoding="utf-8"))  data = c.recv(1024)  print("服务端:",str(data,encoding="utf-8")) c.close()'''import socketimport geventip_bind = ("127.0.0.1",8000)c = socket.socket()c.connect(ip_bind)def f(n):  while True:    # 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 = []  """  多线程实现并发客户端    for i in range(500):     t = threading.Thread(target=f,args=[str(i),])     t.start()     l.append(t)  for t in l:     t.join()   """  # 多进程实现并发客户端  for i in range(100):    p = multiprocessing.Process(target=f,args=[i,])    p.start()    l.append(p)  for p in l:    p.join()

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持武林网。

发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表