
Python网络与并发编程
文章平均质量分 83
...
云崖先生
持续分享Python、Golang、JavaScript、MySQL、Redis、Elasticsearch、MongoDB等相关知识。
Ps:高产似母猪
展开
-
Python网络与并发编程 18 asyncio 协程
协程协程(coroutine)并不是一个系统层面上真实存在的东西,而是由程序员进行创造。你可以理解为协程是用户态的“线程”,因此协程也被称为“微线程”或者“纤程(Fiber)”。协程能够做到在单线程下实现多线程的并发操作,这是非常厉害的一点。既然协程和线程很像,那么它对比线程有什么优势呢?协程和线程一样能够做切换,但是其切换代价远远小于线程,极大的提升了运行效率协程中修改共享数据时不需要为数据加锁,因为协程本身就是一个单线程协程有2大重要的概念,如下所示:作为用户态线程,它必然存在于内原创 2021-07-12 14:19:55 · 334 阅读 · 0 评论 -
Python网络与并发编程 17 常见I/O示例演示
阻塞I/O的socket服务端使用socket模块与concurrent.futures实现阻塞式I/O的socket服务端。开启多个子线程,每个子线程单独负责一个链接,这意味着该服务器最大的并发量取决于你CPU能够打开的最大有效线程数:import socketimport threadingimport concurrent.futuresclass TcpServer: def __init__(self, bind_addr=("localhost", 8001), allo原创 2021-07-12 14:19:14 · 176 阅读 · 0 评论 -
Python网络与并发编程 16 Linux五大I/O模型
基础知识I/O分类常见的I/O主要分为以下几类,如下所示:阻塞I/O(blocking I/O)非阻塞I/O(non-blocking I/O)同步I/O(sync I/O)异步I/O(async I/O)同步:调用端会一直等待服务端响应,直到返回结果异步:调用端发起调用之后不会等待服务端响应。服务端通过某种通知机制或者回调函数来通知客户端阻塞:服务端返回结果之前,客户端线程会被挂起,此时线程不可被CPU调度,线程暂停运行非阻塞:在服务端返回前,函数不会阻塞调用端线程,而会立刻返回原创 2021-07-12 14:18:20 · 179 阅读 · 0 评论 -
Python网络与并发编程 15 使用执行器提交任务
concurrent.futures我们在以往创建线程或进程的时候都会使用threading与multiprocessing模块进行创建。那么在本章节学习完成后就不要使用这两种方式创建线程或者进程了,而是应当使用concurrent.futures所提供的执行器来构建线程或进程并执行任务。concurrent.futures提供了2种执行器,如下所示,它们的接口使用也都一模一样:from concurrent.futures import ThreadPoolExecutor # 线程池执行器f原创 2021-07-12 14:17:40 · 1636 阅读 · 0 评论 -
Python网络与并发编程 14 生产者消费者模型
生产者消费者模型生产者消费者模型是一种设计思想,生产者生产出产品,消费者对产品进行消费。但是他们之间不直接进行接触,而是通过中间件进行产品交易,这样做的好处是降低生产者与消费者之间的耦合度,使他们没有强制的关联。如下图所示,当生产者生产出产品后会将产品放入中间件中,消费者监听中间件当中间件状态一旦发生变化后就立即获取出产品并消费:多线程实现下面将采用多线程实现生产者与消费者模型,需要借助queue.Queue()作为中间件:import threadingimport queueimpor原创 2021-07-12 14:16:34 · 166 阅读 · 0 评论 -
Python网络与并发编程 13 线程或进程通信
线程或进程通信在同一个进程中,该进程下的所有数据资源都会被该进程下的线程共享。为了保证数据安全性,我们在多个线程进行数据交互时必须使用一种线程安全的容器来承载交互信息。如,常见的Redis数据库、MQ等消息中间件是非常好的选择。当然,多进程也是如此。但是在实际的测试环境中,我们需要更加方便的一些工具来测试代码是否准确,这时候就会用到下面介绍的工具了。多线程通信queuequeue模块对于多线程通信来讲是十分明智的选择,它使用简单开箱即用,最关键的一点是它是Python的内置模块,故不用经历任原创 2021-07-12 14:15:58 · 130 阅读 · 0 评论 -
Python网络与并发编程 12 multiprocessing模块使用
multiprocessing模块Python中提供了multiprocessing模块来实现进程并发编程,官方文档如下:官方文档由于GIL锁的存在,所以CPython中多线程是不能够并行运行的,但是多进程可以并行运行,该模块用到的地方基本很少,但是仍然需要进行掌握。此外,它和threading模块99%的接口都一模一样,只有少量的差别。添加子进程针对不同平台选择添加子进程的方式multiprocessing模块针对不同的平台,添加子进程的方式也有所区别:spawn:该方式是Windows原创 2021-07-12 14:15:12 · 227 阅读 · 0 评论 -
Python网络与并发编程 11 threading.local()功能介绍
threading.local()threading.local()方法可以让每个线程都拥有一些自己独立的数据,这些数据是其他线程访问不到的。如图所示:或者用另外一种更形象的比喻更加的贴切,将一个进程比喻成一个公司,该进程下的线程比喻成公司的员工,而将threading.local()比喻为公司的储物柜,每个员工都有一个单独的柜格,且每个员工也只能访问自己的柜格。如图所示:那么这个东西到底有什么作用?举个例子,当你使用迅雷进行多线程下载时,每个线程的下载进度是不一样的,那么这个下载进度如何进行原创 2021-07-12 14:14:24 · 349 阅读 · 0 评论 -
Python网络与并发编程 10 threading模块线程锁
前言本章节将继续围绕threading模块讲解,基本上是纯理论偏多。对于日常开发者来讲很少会使用到本章节的内容,但是对框架作者等是必备知识,同时也是高频的面试常见问题。官方文档线程安全线程安全是多线程或多进程编程中的一个概念,在拥有共享数据的多条线程并行执行的程序中,线程安全的代码会通过同步机制保证各个线程都可以正常且正确的执行,不会出现数据污染等意外情况。线程安全的问题最主要还是由线程切换导致的,比如一个房间(进程)中有10颗糖(资源),除此之外还有3个小人(1个主线程、2个子线程),当小人A原创 2021-07-11 15:22:07 · 293 阅读 · 0 评论 -
Python网络与并发编程 09 threading模块使用
threading模块Python中提供了threading模块来实现线程并发编程,官方文档如下:官方文档添加子线程实例化Thread类使用该方式新增子线程任务是比较常见的,也是推荐使用的。简单的代码示例如下,创建3个子线程并向其添加任务,然后运行并打印它们的线程ID和线程名字:import threadingimport timedef task(params): print("sub thread run") currentThread = threading.cu原创 2021-07-11 15:21:28 · 567 阅读 · 0 评论 -
Python网络与并发编程 08 GIL锁
GIL锁是什么GIL锁是CPython所独有的,全称为Global Interpreter Lock,译为全局解释器锁。它是CPython经常被人诟病的一个槽点,直接让CPython的多线程变成了残废。GIL锁产生的原因CPython中的一个线程对应于C语言中的一个线程,而CPython在执行函数时会将函数转变为可执行的字节码,如果多个线程同时运行一段字节码是很有可能出错的,为了避免这个错误所以Python使用了GIL锁限制了多线程技术。GIL锁使得同一个时刻的同一进程下的多个线程只能有一个在CP原创 2021-07-11 15:20:40 · 233 阅读 · 2 评论 -
Python网络与并发编程 07 线程与进程
进程相关程序和进程程序是一堆躺在硬盘中的代码,是“死”的进程是程序被调用执行时活动的状态,是“活”的当程序运行时必定会产生很多的数据,那么这些数据会被保存在进程中,所以:进程是最小的资源单元注意一点,程序只有在运行状态时才会产生进程,而不运行时就是一堆代码而已。因此,你可以理解为每一段程序运行时都会创建一个“小房子”,这个“小房子”中存放了很多资源。进程是由谁创建的进程必定是由操作系统所创建,每个程序运行时都必然会产生一个进程,当然也可以产生多个进程。如下图所示:进程间的数据交原创 2021-07-11 15:20:01 · 117 阅读 · 2 评论 -
Python网络与并发编程 06 并发与并行
并发与并行并发和并行是指操作系统处理任务的能力。即有多个任务时是一个一个的处理?还是一次处理多个?并发:操作系统具有处理多个任务的能力并行:操作系统具有同时处理多个任务的能力并发是包含并行的,这里再提出一个伪并行的概念,就是看起来像是同时处理多个任务,但是实际上这些任务并不是被同时处理的,而是具有一定的先后次序,由于这种任务处理切换的速度太快了,所以看起来像是同时处理。同步与异步同步和异步是指任务的提交方式。即当一个任务提交完成后是否需要等待任务的反馈结果出现后再去做其他的事情。同原创 2021-07-11 15:19:11 · 115 阅读 · 0 评论 -
Python网络与并发编程 05 任务处理发展史
从任务处理角度看待操作系统发展史操作系统的作用是管理硬件,目的是为了让用户更加方便的来操控计算机底层的硬件。可以看到操作系统对于人们操控计算机进行作业有着不可小觑的功劳,那么在早期没有操作系统的时候你能想象是什么样子吗?现在我们来看一看。手动化时代早期的计算机并没有操作系统,而是通过纸带来进行程序的编辑。它有3台设备,分别是:输入机计算机输出机那个时候的程序员需要一起约定好时间,来轮流的对自己的程序进行编辑,因为那个时候的计算机在同一时刻下只能由一个人去运行和掌控,我们来看一下它的计原创 2021-07-11 15:18:17 · 120 阅读 · 0 评论 -
Python网络与并发编程 04 socketserver源码
基础源码包含信息socketserver源代码中基本上所有的类都会分成两部分。server类:处理链接相关request类:处理通信相关我们可以看一下socketserver中使用到了哪些比较基础的模块(socketserver.py line 126 - 136):import socket # socket基础模块import selectors # I/O多路复用模块import os # 操作系统接口模块import errno # 定义符号原创 2021-07-11 15:17:14 · 238 阅读 · 1 评论 -
Python网络与并发编程 03 socketserver模块
socketserver简介在之前我们使用socket模块来构建服务器,但是使用该模块所编写的服务器处理请求都是串行的,即来一个处理一个,无疑这样的处理效率是十分低下的。那么本篇文章将介绍socketserver模块的使用,它是对socket模块的更高级别封装,内部支持I/O多路复用机制,能够在最短的时间内处理更多的请求。官方文档:点我跳转TCP/socketserver下面是使用socketserver模块构建TCP服务器的基本格式:import socketserverclass Se原创 2021-07-11 15:16:46 · 269 阅读 · 1 评论 -
Python网络与并发编程 02 TCP粘包
TCP/Socket与subprocess我们准备做一个可以在Client端远程执行Server端的shell命令并拿到其执行结果的程序,而涉及到网络通信就必然会使用到socket模块,此外还需要subprocess模块拿到命令执行结果。关于传输层协议的选择我们采用TCP协议,因为它是可靠传输协议且一次传输的数据量要比UDP协议更大。以下是Server端的代码实现:import subprocessfrom socket import *# 默认直接实例化socket是IPV4 + TCP协议原创 2021-07-11 15:16:09 · 427 阅读 · 0 评论 -
Python网络与并发编程 01 Socket编程
前瞻知识C/S架构C/S架构是一种由服务端(Server)和客户端(Client)组成的双层架构。互联网中处处充满了C/S架构(Client/Server),比如我们需要玩英雄联盟,就必须连接至英雄联盟的服务器上,那么对于我们玩家来说它的英雄联盟服务器就是Server端,而我们必须要下载一个英雄联盟Client端才能够去和英雄联盟Server端进行数据交互。五层协议互联网的协议实际上就是为了让计算机之间互相进行通信而产生的,本身并没有层级之分。为了便于理解,我们可以按照功能将它们划分成5层或者7原创 2021-07-11 15:14:00 · 315 阅读 · 2 评论