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下载较大的文件时,往往比较耗时,如何提高从 ...
随机推荐
- (转)Struts2的拦截器
http://blog.csdn.net/yerenyuan_pku/article/details/68648101 Struts2的拦截器 拦截器的概述 拦截器,在AOP(Aspect-Orien ...
- swift class protocol-限定协议只能由类实现
protocol GameMode:class “You can limit protocol adoption to class types (and not structures or enume ...
- Java类及成员
Java类及成员 类 类是对一类事物的的描述,是抽象的概念上的定义:类是创建对象的模板: public class TestClass { public static void main(String ...
- idea中配置xml不自动提示解决方案
1.打开设置File-->Settings(或者Ctrl + Alt + S)--->Languages&Frameworks-->Schemas and DTDS 2.选择 ...
- NTP测试1
ntp server A : 10.101.75.8 B : 10.101.75.38 B: [root@r10n16313.sqa.zmf /home/ahao.mah] #cat /etc/ntp ...
- Qt Creator 中文乱码问题
一. Qt 4 乱码问题 解决方案 1. 在Qt 中 快捷菜单选项功能中 Edit(编辑) --> Select Encoding...(选择编码) 选择载入(显示)编码和储存编码,要解决中文 ...
- PAT 1091. Acute Stroke (bfs)
One important factor to identify acute stroke (急性脑卒中) is the volume of the stroke core. Given the re ...
- ReportNG 替换testng获得测试报告
1.导入reportng相关jar包
- [POJ1226]Substrings(后缀数组)
传送门 给定 n 个字符串,求出现或反转后出现在每个字符串中的最长子串. 算法分析: 这题不同的地方在于要判断是否在反转后的字符串中出现.其实这并没有加大题目的难度. 只需要先将每个字符串都反过来写一 ...
- noip模拟赛 楼
分析:题目可以转化为对于一个数,对它进行x次减法操作,n-x次加法操作,使他变成最小的非负整数.因为每减一次数就会减小,次数是一定的,所以可以二分x,就可以了. #include <cstdio ...