一:基于多线程实现套接字

可添加多个客户端

  1. from socket import *
  2. from threading import Thread
  3.  
  4. def comunicate(conn):
  5. while True: # 通信循环
  6. try:
  7. data = conn.recv(1024)
  8. if len(data) == 0:
  9. break
  10. conn.send(data.upper())
  11. except ConnectionResetError:
  12. break
  13. conn.close()
  14.  
  15. def server(ip, port, backlog=5):
  16. server = socket(AF_INET, SOCK_STREAM)
  17. server.bind((ip, port))
  18. server.listen(backlog)
  19.  
  20. while True: # 链接循环
  21. conn, client_addr = server.accept()
  22. print(client_addr)
  23.  
  24. # 通信
  25. t = Thread(target=comunicate, args=(conn,))
  26. t.start()
  27.  
  28. if __name__ == '__main__':
  29. s = Thread(target=server, args=('127.0.0.1', 8081))
  30. s.start()

服务端

  1. from socket import *
  2.  
  3. client = socket(AF_INET, SOCK_STREAM)
  4. client.connect(('127.0.0.1', 8081))
  5.  
  6. while True:
  7. msg = input('>>:').strip()
  8. if len(msg) == 0:
  9. continue
  10. client.send(msg.encode('utf-8'))
  11. data = client.recv(1024)
  12. print(data.decode('utf-8'))

客户端01

  1. from socket import *
  2.  
  3. client = socket(AF_INET, SOCK_STREAM)
  4. client.connect(('127.0.0.1', 8081))
  5.  
  6. while True:
  7. msg = input('>>:').strip()
  8. if len(msg) == 0:
  9. continue
  10. client.send(msg.encode('utf-8'))
  11. data = client.recv(1024)
  12. print(data.decode('utf-8'))

客户端02

二:gevent

通过gevent实现单线程下的socket并发(from gevent import monkey;patch_all () 一定要放到导入socket模块之前,否则gevent无法识别socket的阻塞)

  1. from gevent import monkey;monkey.patch_all()
  2. from gevent import spawn,joinall #pip3 install gevent
  3. import time
  4.  
  5. def play(name):
  6. print('%s play 1'%name)
  7. time.sleep(5)
  8. print('%s play 2'%name)
  9.  
  10. def eat(name):
  11. print('%s eat 1' % name)
  12. time.sleep(3)
  13. print('%s eat 2' % name)
  14.  
  15. start=time.time()
  16. g1=spawn(play,'dsd')
  17. g2=spawn(eat,'dsd')
  18.  
  19. joinall([g1,g2])
  20.  
  21. print('主',time.time()-start)

三:单线程下实现并发的套接字通信

  1. from threading import Thread,current_thread
  2. from socket import *
  3.  
  4. def client():
  5. client=socket(AF_INET,SOCK_STREAM)
  6. client.connect(('127.0.0.1',8080))
  7.  
  8. n=0
  9. while True:
  10. msg='%s say hello %s'%(current_thread().name,n)
  11. n+=1
  12. client.send(msg.encode('utf-8'))
  13. data=client.recv(1024)
  14. print(data.decode('utf-8'))
  15.  
  16. if __name__ == '__main__':
  17. for i in range(10):
  18. t=Thread(target=client())
  19. t.start()

客户端

  1. from gevent import mokey;
  2.  
  3. mokey.patch_all()
  4. from socket import *
  5. from gevent import spawn
  6.  
  7. def comunicate(conn):
  8. while True: # 通信循环
  9. try:
  10. data = conn.recv(1024)
  11. if len(data) == 0: break
  12. conn.send(data.uppper())
  13. except ConnectionResetError:
  14. break
  15. conn.close()
  16.  
  17. def server(ip, port, backlog=5):
  18. server = socket(AF_INET, SOCK_STREAM)
  19. server.bind((ip, port))
  20. server.listen(backlog)
  21.  
  22. while True: # 连接循环
  23. conn, client_addr = server.accept()
  24. print(client_addr)
  25.  
  26. # 通信
  27. spawn(comunicate, conn)
  28.  
  29. if __name__ == '__main__':
  30. g1 = spawn(server, '127.0.0.1', 8080)
  31. g1 = join()

服务端

Python 37 基于多线程实现套接字 、gevent 、单线程下实现并发的套接字通信的更多相关文章

  1. 并发编程 - 协程 - 1.协程概念/2.greenlet模块/3.gevent模块/4.gevent实现并发的套接字通信

    1.协程并发:切+保存状态单线程下实现并发:协程 切+ 保存状态 yield 遇到io切,提高效率 遇到计算切,并没有提高效率 检测单线程下 IO行为 io阻塞 切 相当于骗操作系统 一直处于计算协程 ...

  2. Python 37 进程池与线程池 、 协程

    一:进程池与线程池 提交任务的两种方式: 1.同步调用:提交完一个任务之后,就在原地等待,等任务完完整整地运行完毕拿到结果后,再执行下一行代码,会导致任务是串行执行 2.异步调用:提交完一个任务之后, ...

  3. Cpython解释器下实现并发编程——多进程、多线程、协程、IO模型

    一.背景知识 进程即正在执行的一个过程.进程是对正在运行的程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所有内容都 ...

  4. 31、Python程序中的协程操作(greenlet\gevent模块)

    一.协程介绍 协程:是单线程下的并发,又称微线程,纤程.英文名Coroutine.一句话说明什么是协程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的. 对比操作系统控制线程的切换,用 ...

  5. python 并发编程 基于gevent模块 协程池 实现并发的套接字通信

    基于协程池 实现并发的套接字通信 客户端: from socket import * client = socket(AF_INET, SOCK_STREAM) client.connect(('12 ...

  6. python之路-----多线程与多进程

    一.进程和线程的概念 1.进程(最小的资源单位): 进程:就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成. 程序:我们编写的程序用来描述进程要完成哪些功能以 ...

  7. python基础之多线程与多进程(二)

    上课笔记整理: 守护线程的作用,起到监听的作用 一个函数连接数据库 一个做守护线程,监听日志 两个线程同时取一个数据 线程---->线程安全---->线程同时进行操作数据. IO操作--- ...

  8. Python多进程与多线程编程及GIL详解

    介绍如何使用python的multiprocess和threading模块进行多线程和多进程编程. Python的多进程编程与multiprocess模块 python的多进程编程主要依靠multip ...

  9. Python之FTP多线程下载文件之多线程分块下载文件

    Python之FTP多线程下载文件之多线程分块下载文件 Python中的ftplib模块用于对FTP的相关操作,常见的如下载,上传等.使用python从FTP下载较大的文件时,往往比较耗时,如何提高从 ...

随机推荐

  1. Python星号表达式

    有时候可能想分解出某些值然后丢弃它们,可以使用诸如 _ 或者 ign(ignored)等常用来表示待丢弃值的变量名: record = ('ACME', 50, 123.45, (12, 18, 20 ...

  2. 在centOS环境搭建airtest时遇到 Xlib.error.DisplayNameError: Bad display name "" 和Xlib.error.XauthError异常

    现在的问题 (airtestVenv) [root@67 airtest_selenium]# python3 proxy.pyTraceback (most recent call last):  ...

  3. Sping装配之——自动装配

    Sping从两个角度来实现自动化装配: 组件扫描(component scaning):spring会自动发现应用上下文中所创建的bean; 自动装配(autowiring):spring自动满足be ...

  4. IO编程——复制一个文件中的内容到另一个文件

    public class TestIO { public static void main(String[] args) { File inputFile = new File("a.txt ...

  5. asp.net 跨域问题

    asp.net 跨域问题 解决方案1: public void ProcessRequest(HttpContext context) { //解决跨域问题 context.Response.Clea ...

  6. 常用Git命令大全思维导图

    开发中代码管理少不了使用Git,对于初学者来说Git命令的学习是一个难过的坎,为了帮助大家记忆并快速掌握Git的基本使用,我把常用的Git命令整理成思维导图,分享给大家. 高清大图在线预览 http: ...

  7. elasticsearch 数据导入(九)

    说明 maven依赖 官方客户端 https://www.elastic.co/guide/en/elasticsearch/client/java-rest/6.4/index.html <d ...

  8. [Usaco2007 Dec]队列变换

    [Usaco2007 Dec]队列变换 题目 FJ打算带他的N(1 <= N <= 30,000)头奶牛去参加一年一度的“全美农场主大奖赛”.在这场比赛中,每个参赛者都必须让他的奶牛排成一 ...

  9. hdu 4941 stl的map<node,int>用法

    #include<iostream> #include<cstdio> #include<cstring> #include<map> using na ...

  10. java中String类型转换为float类型

    import java.io.*; public class Demo1{ public static void main(String args[]) { String df="12.2& ...