Python 37 基于多线程实现套接字 、gevent 、单线程下实现并发的套接字通信
一:基于多线程实现套接字
可添加多个客户端
- from socket import *
- from threading import Thread
- def comunicate(conn):
- while True: # 通信循环
- try:
- data = conn.recv(1024)
- if len(data) == 0:
- break
- conn.send(data.upper())
- except ConnectionResetError:
- break
- conn.close()
- def server(ip, port, backlog=5):
- server = socket(AF_INET, SOCK_STREAM)
- server.bind((ip, port))
- server.listen(backlog)
- while True: # 链接循环
- conn, client_addr = server.accept()
- print(client_addr)
- # 通信
- t = Thread(target=comunicate, args=(conn,))
- t.start()
- if __name__ == '__main__':
- s = Thread(target=server, args=('127.0.0.1', 8081))
- s.start()
服务端
- from socket import *
- client = socket(AF_INET, SOCK_STREAM)
- client.connect(('127.0.0.1', 8081))
- while True:
- msg = input('>>:').strip()
- if len(msg) == 0:
- continue
- client.send(msg.encode('utf-8'))
- data = client.recv(1024)
- print(data.decode('utf-8'))
客户端01
- from socket import *
- client = socket(AF_INET, SOCK_STREAM)
- client.connect(('127.0.0.1', 8081))
- while True:
- msg = input('>>:').strip()
- if len(msg) == 0:
- continue
- client.send(msg.encode('utf-8'))
- data = client.recv(1024)
- print(data.decode('utf-8'))
客户端02
二:gevent
通过gevent实现单线程下的socket并发(from gevent import monkey;patch_all () 一定要放到导入socket模块之前,否则gevent无法识别socket的阻塞)
- from gevent import monkey;monkey.patch_all()
- from gevent import spawn,joinall #pip3 install gevent
- import time
- def play(name):
- print('%s play 1'%name)
- time.sleep(5)
- print('%s play 2'%name)
- def eat(name):
- print('%s eat 1' % name)
- time.sleep(3)
- print('%s eat 2' % name)
- start=time.time()
- g1=spawn(play,'dsd')
- g2=spawn(eat,'dsd')
- joinall([g1,g2])
- print('主',time.time()-start)
三:单线程下实现并发的套接字通信
- from threading import Thread,current_thread
- from socket import *
- def client():
- client=socket(AF_INET,SOCK_STREAM)
- client.connect(('127.0.0.1',8080))
- n=0
- while True:
- msg='%s say hello %s'%(current_thread().name,n)
- n+=1
- client.send(msg.encode('utf-8'))
- data=client.recv(1024)
- print(data.decode('utf-8'))
- if __name__ == '__main__':
- for i in range(10):
- t=Thread(target=client())
- t.start()
客户端
- from gevent import mokey;
- mokey.patch_all()
- from socket import *
- from gevent import spawn
- def comunicate(conn):
- while True: # 通信循环
- try:
- data = conn.recv(1024)
- if len(data) == 0: break
- conn.send(data.uppper())
- except ConnectionResetError:
- break
- conn.close()
- def server(ip, port, backlog=5):
- server = socket(AF_INET, SOCK_STREAM)
- server.bind((ip, port))
- server.listen(backlog)
- while True: # 连接循环
- conn, client_addr = server.accept()
- print(client_addr)
- # 通信
- spawn(comunicate, conn)
- if __name__ == '__main__':
- g1 = spawn(server, '127.0.0.1', 8080)
- g1 = join()
服务端
Python 37 基于多线程实现套接字 、gevent 、单线程下实现并发的套接字通信的更多相关文章
- 并发编程 - 协程 - 1.协程概念/2.greenlet模块/3.gevent模块/4.gevent实现并发的套接字通信
1.协程并发:切+保存状态单线程下实现并发:协程 切+ 保存状态 yield 遇到io切,提高效率 遇到计算切,并没有提高效率 检测单线程下 IO行为 io阻塞 切 相当于骗操作系统 一直处于计算协程 ...
- Python 37 进程池与线程池 、 协程
一:进程池与线程池 提交任务的两种方式: 1.同步调用:提交完一个任务之后,就在原地等待,等任务完完整整地运行完毕拿到结果后,再执行下一行代码,会导致任务是串行执行 2.异步调用:提交完一个任务之后, ...
- Cpython解释器下实现并发编程——多进程、多线程、协程、IO模型
一.背景知识 进程即正在执行的一个过程.进程是对正在运行的程序的一个抽象. 进程的概念起源于操作系统,是操作系统最核心的概念,也是操作系统提供的最古老也是最重要的抽象概念之一.操作系统的其他所有内容都 ...
- 31、Python程序中的协程操作(greenlet\gevent模块)
一.协程介绍 协程:是单线程下的并发,又称微线程,纤程.英文名Coroutine.一句话说明什么是协程:协程是一种用户态的轻量级线程,即协程是由用户程序自己控制调度的. 对比操作系统控制线程的切换,用 ...
- python 并发编程 基于gevent模块 协程池 实现并发的套接字通信
基于协程池 实现并发的套接字通信 客户端: from socket import * client = socket(AF_INET, SOCK_STREAM) client.connect(('12 ...
- python之路-----多线程与多进程
一.进程和线程的概念 1.进程(最小的资源单位): 进程:就是一个程序在一个数据集上的一次动态执行过程.进程一般由程序.数据集.进程控制块三部分组成. 程序:我们编写的程序用来描述进程要完成哪些功能以 ...
- python基础之多线程与多进程(二)
上课笔记整理: 守护线程的作用,起到监听的作用 一个函数连接数据库 一个做守护线程,监听日志 两个线程同时取一个数据 线程---->线程安全---->线程同时进行操作数据. IO操作--- ...
- Python多进程与多线程编程及GIL详解
介绍如何使用python的multiprocess和threading模块进行多线程和多进程编程. Python的多进程编程与multiprocess模块 python的多进程编程主要依靠multip ...
- Python之FTP多线程下载文件之多线程分块下载文件
Python之FTP多线程下载文件之多线程分块下载文件 Python中的ftplib模块用于对FTP的相关操作,常见的如下载,上传等.使用python从FTP下载较大的文件时,往往比较耗时,如何提高从 ...
随机推荐
- Python星号表达式
有时候可能想分解出某些值然后丢弃它们,可以使用诸如 _ 或者 ign(ignored)等常用来表示待丢弃值的变量名: record = ('ACME', 50, 123.45, (12, 18, 20 ...
- 在centOS环境搭建airtest时遇到 Xlib.error.DisplayNameError: Bad display name "" 和Xlib.error.XauthError异常
现在的问题 (airtestVenv) [root@67 airtest_selenium]# python3 proxy.pyTraceback (most recent call last): ...
- Sping装配之——自动装配
Sping从两个角度来实现自动化装配: 组件扫描(component scaning):spring会自动发现应用上下文中所创建的bean; 自动装配(autowiring):spring自动满足be ...
- IO编程——复制一个文件中的内容到另一个文件
public class TestIO { public static void main(String[] args) { File inputFile = new File("a.txt ...
- asp.net 跨域问题
asp.net 跨域问题 解决方案1: public void ProcessRequest(HttpContext context) { //解决跨域问题 context.Response.Clea ...
- 常用Git命令大全思维导图
开发中代码管理少不了使用Git,对于初学者来说Git命令的学习是一个难过的坎,为了帮助大家记忆并快速掌握Git的基本使用,我把常用的Git命令整理成思维导图,分享给大家. 高清大图在线预览 http: ...
- elasticsearch 数据导入(九)
说明 maven依赖 官方客户端 https://www.elastic.co/guide/en/elasticsearch/client/java-rest/6.4/index.html <d ...
- [Usaco2007 Dec]队列变换
[Usaco2007 Dec]队列变换 题目 FJ打算带他的N(1 <= N <= 30,000)头奶牛去参加一年一度的“全美农场主大奖赛”.在这场比赛中,每个参赛者都必须让他的奶牛排成一 ...
- hdu 4941 stl的map<node,int>用法
#include<iostream> #include<cstdio> #include<cstring> #include<map> using na ...
- java中String类型转换为float类型
import java.io.*; public class Demo1{ public static void main(String args[]) { String df="12.2& ...