【Python之旅】第五篇(三):Python Socket多线程并发

简介:

 前面的几个例子都是单线程的,下面再来说说多线程的。


1.多线程模块

    主要是socketserver模块,如下图示:

wKiom1YPmb2TPBqQAAJlgI3CCPk647.jpg


2.多线程原理

    如下图示说明:

wKioL1YPmgyj_atyAAIZT9TernQ085.jpg


3.SockteServer例子说明

服务器端:

wKiom1YPmkjiaEvhAALY_XJdPtI659.jpg


客户端:

wKioL1YPmnahMs6AAAGY8lr71ok291.jpg


4.演示

    还是以前面例子,对代码进行修改,作如下的演示。

Server端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import  SocketServer            #导入SocketServer,多线程并发由此类实现
 
class  MySockServer(SocketServer.BaseRequestHandler):    #定义一个类
 
     def handle(self):      #handle(self)方法是必须要定义的,可以看上面的说明
         print  'Got a new connection from' , self.client_address
         while  True:
             data = self.request.recv( 1024 )    #需要通过self的方法调用数据接收函数
             if  not data: break
             print  'recv:' , data
 
             self.request.send(data.upper())   #需要通过self的方法调用数据接收函数
 
if  __name__ ==  '__main__' :    #并非一定要用这样的方式,只是建议这样使用
     HOST =  ''              #定义侦听本地地址口(多个IP地址情况下),这里表示侦听所有
     PORT =  50007           #Server端开放的服务端口
     s = SocketServer.ThreadingTCPServer((HOST, PORT), MySockServer)
                               #调用SocketServer模块的多线程并发函数
     s.serve_forever()     #持续接受客户端的连接

Client端:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
import  socket
 
HOST =  '192.168.1.13'
PORT =  50007
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
s.connect((HOST, PORT))
 
while  True:
     user_input = raw_input( 'msg to send:' ).strip()
     s.sendall(user_input)
     data = s.recv( 1024 )
     print  'Received' , repr(data)
 
s.close()

演示:

步骤1:Server端运行服务端程序

1
2
xpleaf@xpleaf-machine:/mnt/hgfs/Python/day5$ python Thread_socket_server4.py 
===>光标在此处处于等待状态

步骤2:Client A端运行客户端程序

1
2
3
4
5
6
xpleaf@xpleaf-machine:/mnt/hgfs/Python/day5$ python client4.py 
msg to send:Hello!    ===>User输入数据
Received  'HELLO!'      ===>Server端返回的数据
msg to send:I'm Client A.
Received  "I'M CLIENT A."
msg to send:          ===>继续等待User输入数据

步骤3:在Server端中观察现象

1
2
3
4
5
xpleaf@xpleaf-machine:/mnt/hgfs/Python/day5$ python Thread_socket_server4.py 
Got a  new  connection from ( '192.168.1.13' 52650 )
recv: Hello!        
recv: I'm Client A.    ===>接收到Client A端发送的数据
===>光标在此处处于等待状态
步骤4:Client B端运行客户端程序
1
2
3
4
xpleaf@xpleaf-machine:/mnt/hgfs/Python/day5$ python client4.py 
msg to send:I'm Client B.    ===>User输入数据
Received  "I'M CLIENT B."      ===>Server端返回的数据
msg to send:                 ===>继续等待User输入数据

步骤5:在Server端中观察现象

1
2
3
4
5
6
7
xpleaf@xpleaf-machine:/mnt/hgfs/Python/day5$ python Thread_socket_server4.py 
Got a  new  connection from ( '192.168.1.13' 52650 )
recv: Hello!
recv: I'm Client A.
Got a  new  connection from ( '192.168.1.13' 52651 )
recv: I'm Client B.    ===>接收到Client A端发送的数据
===>光标在此处处于等待状态

    通过上面的演示,使用SocketServer便可以实现Python Socket的多线程并发。

相关文章
|
3月前
|
数据采集 存储 JSON
Python爬取知乎评论:多线程与异步爬虫的性能优化
Python爬取知乎评论:多线程与异步爬虫的性能优化
|
3月前
|
人工智能 安全 调度
Python并发编程之线程同步详解
并发编程在Python中至关重要,线程同步确保多线程程序正确运行。本文详解线程同步机制,包括互斥锁、信号量、事件、条件变量和队列,探讨全局解释器锁(GIL)的影响及解决线程同步问题的最佳实践,如避免全局变量、使用线程安全数据结构、精细化锁的使用等。通过示例代码帮助开发者理解并提升多线程程序的性能与可靠性。
128 0
|
1月前
|
调度 数据库 Python
Python异步编程入门:asyncio让并发变得更简单
Python异步编程入门:asyncio让并发变得更简单
123 5
|
3月前
|
数据采集 监控 调度
干货分享“用 多线程 爬取数据”:单线程 + 协程的效率反超 3 倍,这才是 Python 异步的正确打开方式
在 Python 爬虫中,多线程因 GIL 和切换开销效率低下,而协程通过用户态调度实现高并发,大幅提升爬取效率。本文详解协程原理、实战对比多线程性能,并提供最佳实践,助你掌握异步爬虫核心技术。
|
4月前
|
JSON 算法 Java
打造终端里的下载利器:Python实现可恢复式多线程下载器
在数字时代,大文件下载已成为日常需求。本文教你用Python打造专业级下载器,支持断点续传、多线程加速、速度限制等功能,显著提升终端下载体验。内容涵盖智能续传、多线程分块下载、限速控制及Rich库构建现代终端界面,助你从零构建高效下载工具。
274 1
|
3月前
|
数据采集 存储 Java
多线程Python爬虫:加速大规模学术文献采集
多线程Python爬虫:加速大规模学术文献采集
|
5月前
|
调度 Python
探索Python高级并发与网络编程技术。
可以看出,Python的高级并发和网络编程极具挑战,却也饱含乐趣。探索这些技术,你将会发现:它们好比是Python世界的海洋,有穿越风暴的波涛,也有寂静深海的奇妙。开始旅途,探索无尽可能吧!
129 15
|
4月前
|
数据采集 网络协议 前端开发
Python多线程爬虫模板:从原理到实战的完整指南
多线程爬虫通过并发请求大幅提升数据采集效率,适用于大规模网页抓取。本文详解其原理与实现,涵盖任务队列、线程池、会话保持、异常处理、反爬对抗等核心技术,并提供可扩展的Python模板代码,助力高效稳定的数据采集实践。
208 0
|
9月前
|
并行计算 安全 Java
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析
在Python开发中,GIL(全局解释器锁)一直备受关注。本文基于CPython解释器,探讨GIL的技术本质及其对程序性能的影响。GIL确保同一时刻只有一个线程执行代码,以保护内存管理的安全性,但也限制了多线程并行计算的效率。文章分析了GIL的必要性、局限性,并介绍了多进程、异步编程等替代方案。尽管Python 3.13计划移除GIL,但该特性至少要到2028年才会默认禁用,因此理解GIL仍至关重要。
595 16
Python GIL(全局解释器锁)机制对多线程性能影响的深度分析

热门文章

最新文章

推荐镜像

更多