🔥🔥Java开发者的Python快速进修指南:网络编程及并发编程
今天我们将对网络编程和多线程技术进行讲解,这两者的原理大家都已经了解了,因此我们主要关注的是它们的写法区别。虽然这些区别并不是非常明显,但我们之所以将网络编程和多线程一起讲解,是因为在学习Java的socket知识时,我们通常会将它们结合使用,以实现服务器对多个客户端连接的阻塞IO的处理。虽然我是这样解释的,但是Python在控制连接数方面更加友好,相对于Java来说更加便捷。好了,废话不多说,让我们开始今天的讲解吧。
socket及线程
这里我将给大家举一个例子,同时也会指出一些需要注意的问题,以帮助Java同学们避免再次遇到这些坑。
import socket
import multiprocessing
import time
# 创建互斥锁
lock = multiprocessing.Lock()
# 处理客户端请求的函数
def handle_client(conn, addr):
print(f"Connected to {addr}")
time.sleep(100)
# 创建服务器
def create_server():
# 创建socket对象
server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
# 绑定地址和端口
server_addr = ("localhost", 8000)
server_socket.bind(server_addr)
# 监听连接
server_socket.listen(1)
print("Server started. Listening for connections...")
while True:
# 接受客户端连接
conn, addr = server_socket.accept()
handle_client(conn, addr)
# 创建进程处理客户端请求
process = multiprocessing.Process(target=handle_client, args=(conn, addr))
process.start()
if __name__ == '__main__':
# 启动服务器
print("启动服务器")
create_server()
以下是客户端的代码:
import socket
import time
client = socket.socket() #创建socket对象
host = '127.0.0.1' #服务端ip
port = 8000 #服务端ip端口
client.connect((host, port)) #根据服务端地址,建立连接
print('client对象:', client) #查看socket对象属性
time.sleep(100)
#client.close() #关闭与服务端的连接
上面的例子已经涵盖了我今天要讲的内容,所以没有太多需要补充的了。不过,我可以谈一下与Java的一些区别。
首先,Python使用multiprocessing
来创建多线程,当然还有其他的包可以实现相同的功能,这里就不一一赘述了。另外,还有一个需要注意的地方是,在Python中使用if __name__ == '__main__':
语句时,你必须将其写在主函数中,而不要写在你定义的子函数中。为什么要这样写呢?原因是,当调用process.start()
后,Python会重新执行当前文件,也就是说如果你将if __name__ == '__main__':
这句话写在非主函数中,create_server()
它将会被再次调用。而使用if __name__ == '__main__':
语句可以判断是否是主函数执行,如果不是,则会过滤掉这部分代码。虽然这个机制可能有些令人困惑,但是去深入了解其执行原理并不是必要的,所以大家要记住这个要点。这张图显示的是再次被调用是的名字:
第二:在Python官网中指出,通过调用server_socket.listen(1)可以启动一个服务器,用于接受连接并将未接受的客户端连接放入等待队列中。需要注意的是,等待队列的大小由listen(n)中的参数n+1指定,并不代表实际监听到的客户端连接。如果超过队列大小的连接尝试进入,服务器将直接报错。
总结
今天我们学习了网络编程和多线程技术的写法区别。我们主要关注了在Java中使用socket和多线程结合实现服务器处理多个客户端连接的阻塞IO的方法,以及在Python中使用multiprocessing模块创建多线程的方式。通过一个实例来说明了这些概念,并指出了需要注意的问题。其实了解了这些基本用法后,我们还能够自己实现许多其他功能,例如了解了线程之后,就知道会有队列的概念,然后可以尝试自己实现一个生产者消费者队列。这与学习Java的路线非常相似,并且我们拥有丰富的开发经验,因此我们只需要关注语法方面的学习即可~~
🔥🔥Java开发者的Python快速进修指南:网络编程及并发编程的更多相关文章
- python 闯关之路四(下)(并发编程与数据库编程) 并发编程重点
python 闯关之路四(下)(并发编程与数据库编程) 并发编程重点: 1 2 3 4 5 6 7 并发编程:线程.进程.队列.IO多路模型 操作系统工作原理介绍.线程.进程演化史.特点.区别 ...
- Python开发【第九篇】: 并发编程
内容概要 操作系统介绍 进程 线程 协程 二. 进程 python并发编程之多进程理论部分 在python程序中的进程操作 运行中的程序就是一个进程.所有的进程都是通过它的父进程来创建的.因此,运行起 ...
- 【Java并发编程】并发编程大合集-值得收藏
http://blog.csdn.net/ns_code/article/details/17539599这个博主的关于java并发编程系列很不错,值得收藏. 为了方便各位网友学习以及方便自己复习之用 ...
- 【Java并发编程】并发编程大合集
转载自:http://blog.csdn.net/ns_code/article/details/17539599 为了方便各位网友学习以及方便自己复习之用,将Java并发编程系列内容系列内容按照由浅 ...
- Python3 网络编程和并发编程总结
目录 网络编程 开发架构 OSI七层模型 socket subprocess 粘包问题 socketserver TCP UDP 并发编程 多道技术 并发和并行 进程 僵尸进程和孤儿进程 守护进程 互 ...
- JAVA开发者的Golang快速指南
Golang作为Docker.Kubernetes和OpenShift等一些酷辣新技术的首选编程语言,越来越受欢迎.尤其它们都是开源的,很多情况下,开源是非常有价值的.深入学习阅Golang等源代码库 ...
- MessagePack Java 0.6.X 快速开始指南 - 安装
0.6.x 版本的 MessagePack 已经过期被淘汰了.如果你现在开始使用 MessagePack 话,请不要使用这个版本. 我们再这里保留 0.6.x 版本的内容主要用于参考用途. 最新的 M ...
- 针对Quant的Python快速入门指南
作者:用Python的交易员 (原创文章,转载请注明出处) 最近有越来越多的朋友在知乎或者QQ上问我如何学习入门Python,就目前需求来看,我需要写这么一篇指南. 针对整个vn.py框架的学习,整体 ...
- Python网络编程与并发编程
网络编程基础 黏包 , 并发 计算机网络的发展及基础网络概念 Python 中的进程与 锁 Python IO 多路复用 \协程
- Python之网络编程之并发编程的IO模型,
了解新知识之前需要知道的一些知识 同步(synchronous):一个进程在执行某个任务时,另外一个进程必须等待其执行完毕,才能继续执行 #所谓同步,就是在发出一个功能调用时,在没有得到结果之前,该调 ...
随机推荐
- Python3入门基础教程
引:此文是自己学习python过程中的笔记和总结,适合有语言基础的人快速了解python3和没基础的作为学习的大纲,了解学习的方向.知识点:笔记是从多本书和视频上学习后的整合版. (一)初识pytho ...
- 更快的训练和推理: 对比 Habana Gaudi®2 和英伟达 A100 80GB
通过本文,你将学习如何使用 Habana Gaudi2 加速模型训练和推理,以及如何使用 Optimum Habana 训练更大的模型.然后,我们展示了几个基准测例,包括 BERT 预训练.Stabl ...
- 介绍vue3的钩子函数activated和deactivated使用场景
activated和deactivated是Vue3中的两个生命周期钩子函数. activated钩子函数在组件被激活时调用,通常用于恢复组件的状态或执行一些初始化操作.例如,如果一个组件被从路由中激 ...
- asp.net core之EfCore
EF Core(Entity Framework Core)是一个轻量级.跨平台的对象关系映射(ORM)框架,用于在.NET应用程序中访问和操作数据库.它是Entity Framework的下一代版本 ...
- 自治系统/自治域和自治系统编号(ASN)
定义: 自治系统或自治域(英文:Autonomous system, AS)是指在互联网中,一个或多个实体管辖下的所有IP网络和路由器的组合,它们对互联网执行共同的路由策略.参看RFC 1930中更新 ...
- Android Studio Giraffe安装与gradle配置
本机环境:win10专业版,64位,16G内存. 原先用的AS2.2,是很早之前在看<第一行代码Android(第2版)>的时候,按书里的链接下载安装的,也不用怎么配置.(PS:第一行代码 ...
- 三维模型OBJ格式轻量化压缩主要技术方法浅析
三维模型OBJ格式轻量化压缩主要技术方法浅析 OBJ格式是一种常用的三维模型文件格式,它以文本形式保存了模型的顶点.纹理坐标和法线信息.为了实现轻量化压缩,可以采用以下主要技术方法: 1.简化网格 ...
- C#中的ConcurrentExclusiveSchedulerPair类
为什么使用ConcurrentExclusiveSchedulerPair? 现实生活中的例子是一个停车场的入口和出口,多辆车可以同时进入和离开停车场,但是只有一个车辆可以进入或离开一次. 这时候就需 ...
- 使用antd-mobile遇到的坑
在使用antd-mobile中的组件的时候,遇到了一些比较棘手的问题,经过查找相关资料和网上的帮助,在此整理出了问题以及解决办法: 在引入antd-mobile的时候,根据官网提供的文档: 1,首先安 ...
- PGO in Go 1.21
原文在这里. 由 Michael Pratt 发布于 2023年9月5日 在2023年早些时候,Go 1.20发布了供用户测试的概要版本的基于性能分析的优化(PGO).经过解决预览版已知的限制,并得益 ...