python 并发编程
文章平均质量分 67
并发编程
季布,
每一个你不满意的现在,都有一个你没有努力的曾经。
展开
-
实现协程的方式及协程的意义 【笔记】
协程协程不是计算机提供的,是程序员认为创造协程也被称为微线程,是一种用户态的上下文切换技术,简而言之,就是通过一个线程实现代码互相切换执行实现协程的几种方法:1)greenlet,早期模块2)yield关键字3)asyncio装饰器 (python3.4以后引入的)4)async,await关键字 (python3.5) 推荐1.greenlet实现协程greentlet是一个第三方模块,需要提前安装 pip3 install greenlet才能使用。from greenlet原创 2021-09-12 11:13:41 · 5523 阅读 · 9 评论 -
asyncio 异步编程 【笔记一】
异步编程基于async & await关键字的协程可以实现异步编程,这也是目前python异步相关的主流技术。1.事件循环可以理解成为一个死循环,去检查任务列表中的任务,如果可执行就去执行,如果检查不到就是不可执行的,那就忽略掉去执行其他可执行的任务,如果IO结束了(比如说去百度下载图片,下载完了就会变成可执行任务)再去执行下载完成之后的逻辑#这里的任务是有状态的,比如这个任务已经完成或者正在执行或者正在IO等待任务列表 = [ 任务1, 任务2, 任务3,... ]while True原创 2021-09-12 14:56:53 · 1413 阅读 · 5 评论 -
Python 线程的生命周期
CPU 在轮换执行线程过程中,线程都经历了什么呢?线程从创建到消亡的整个过程,可能会历经 5 种状态,分别是新建、就绪、运行、阻塞和死亡,如图 1 所示。图 1 线程状态转换图线程的新建和就绪状态无论是通过 Thread 类直接实例化对象创建线程,还是通过继承自 Thread 类的子类实例化创建线程,新创建的线程在调用 start() 方法之前,不会得到执行,此阶段的线程就处于新建状态。从图 1 可以看出,只有当线程刚刚创建,且未调用 start() 方法时,该线程才处于新建状态,而一旦线程调用转载 2021-12-10 09:49:40 · 370 阅读 · 0 评论 -
Python 进程间的通信
这里先简述一下进程之间为什么要进行通信我们要知道进程是资源分配的基本单位,不同进程之间的资源是独立的,没有关联,不能在一个进程中直接访问另一个进程资源进程间通信的目的数据传输:一个进程需要将他的数据发送给另一个进程资源共享:多个进程之间共享同样的资源通知时间:一个进程需要向另一个进程发送消息,通知它们本进程发生了什么事情(如进程终止时要通知父进程)进程控制:有些进程希望完全控制另一个进程的执行(如 Debug 进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改原创 2021-12-09 10:41:20 · 1984 阅读 · 0 评论 -
Python 并发编程常见概念
并行和并发并行处理是计算机系统中同时执行两个以上任务的一种执行方法。并行可同时工作同一程序的不同方面,并行处理的主要目的是节省大型和复杂问题的解决时间并发处理指同一时间段中有多个程序都处于已经运行到运行完毕之间,而且这多个程序都是在同一处理机(CPU)上运行,但任意时刻点上只有一个程序在CPU上运行同步和异步同步指一个进程在执行某个请求时,若该请求遇到IO耗时,那么其他进程将会一直等待下去,直到遇到耗时的哪个进程执行结束返回结果,后面的进程才能继续执行下去异步指进程遇到耗时其他进程原创 2021-12-07 13:39:39 · 311 阅读 · 0 评论 -
Python 进程池
进程池可以提供指定数量的进程给用户使用,当有新的请求提交到进程池中时,如果进程池未满,则会创建一个新的进程执行该请求;如果进程池中的进程数已经达到了设置的最大值,那么该请求就会等待,等进程池中有进程空余下来就会执行该任务Python multiprocessing 模块提供了 Pool() 函数,专门用来创建一个进程池multiprocessing 模块中表示进程池的类是 multiprocessing.pool.Pool 类。该类中提供了一些和操作进程池相关的方法apply_async(func[原创 2021-12-07 10:53:06 · 1074 阅读 · 0 评论 -
python Process创建进程
python multiprocessing 模块提供了 Process 类使用Process类创建多线程有以下两种方式:直接创建Process类的实例对象,可创建一个新的进程通过继承Process类的子类,创建实例对象,也可以创建新的进程。继承Process类的子类需要重写父类的run()方法Process类常用属性和方法pid 返回进程的ID号。大多数操作系统都会为每个进程配备唯一的ID号name 可以为进程重命名,也可以获得该进程名称daemon 通过设置该属性为true,可将新原创 2021-12-03 10:47:24 · 884 阅读 · 0 评论 -
Python threading Local()函数
当多线程操作同一公共资源的时候,如果修改这一资源可能会导致数据不同的错误,正常我们会使用互斥锁机制。其实除非必须将多线程使用的资源设置为公共资源,python的threading模块还提供了一种可避免数据不同步问题的方法,即local函数()使用local函数创建的变量可以被各个线程调用,但和公共资源不同,各个线程在使用local()函数创建的变量时,都会在该线程自己的内存空间中拷贝一份。这意味着local()函数创建的变量看似全局变量(可以被各个线程调用),但各线程调用的都是该变量的副本各调用各的,.原创 2021-12-02 10:46:24 · 627 阅读 · 0 评论 -
Python 线程池原理及其应用
早期的python2中是没有线程池这一概念的,只有进程池。直到python3的出现才引入了线程池,但其他进程池和线程池的使用方法比较类似。线程池和进程池的作用即是为了让我们能够更加便捷的管理线程和进程一般我们通过动态创建子线程来实现并发任务,但是会有这样一些缺点:动态创建线程比较耗费时间,这样导致服务器响应较慢,系统启动一个新线程的成本是比较高的,因为它涉及与操作系统的交互,优点使用线程池可以有效地控制系统中并发线程的数量。当系统中包含有大量的并发线程时,会导致系统性能急剧下降,甚至导致 Pytho原创 2021-12-01 13:37:46 · 308 阅读 · 0 评论 -
Python Event实现线程通信
Event原理是在线程中立了一个Flag,默认值是False,当一个或多个线程遇到event.wait()方法时阻塞,直到Event内部Flag值变为True.Event 提供了如下方法:is_set():该方法返回 Event 的内部旗标是否为True。set():该方法将会把 Event 的内部旗标设置为 True,并唤醒所有处于等待状态的线程。clear():该方法将 Event 的内部旗标设置为 False,通常接下来会调用 wait() 方法来阻塞当前线程。wait(timeout=N原创 2021-12-01 10:29:17 · 692 阅读 · 0 评论 -
Python Queue队列实现线程通信
三种队列queque.Queque(maxsize=0):先进先出队列,maxsize可以限制队列的大小。如果队列大小达到上限就会加锁,再次加入元素时就会被阻塞,直到队列中的元素被消费。如果将maxsize设置为0或者附属,则该队列的大小就是无限制的queue.LifoQueue(maxsize=0):后进先出队列PriorityQueue(maxsize=0):优先级队列,优先级最小的元素先出队列。这三个队列类的属性和方法Queue.qsize():返回队列的实际大小,也就是该队列中包含几原创 2021-11-30 14:22:28 · 583 阅读 · 0 评论 -
Python condition实现线程通信
python提供的Condition对象提供了对复杂线程同步问题的支持,使用 Condition 可以让那些己经得到 Lock 对象却无法继续执行的线程释放 Lock 对象,Condition 对象也可以唤醒其他处于等待状态的线程。threading.Condition() 可以理解为更加高级的锁,比 Lock 和 Rlock 的用法更高级,能处理一些复杂的线程同步问题。threading.Condition() 创建一把资源锁(默认是Rlock),提供 acquire() 和 release() 方法,原创 2021-11-30 13:30:13 · 210 阅读 · 0 评论 -
Python互斥锁解决线程安全问题
线程是cpu调度的有一定的随机性,而多线程的优势在于并发性,可以同时运行多个任务。当线程需要共享数据时,可能会因为数据不同步而产生错误。使用两个线程分别模拟两个人使用同一个账户做并发取钱操作:import threadingimport timeclass Account: # 定义构造器 def __init__(self, account_no, balance): # 封装账户编号、账户余额的两个成员变量 self.account_no = a原创 2021-11-29 14:25:17 · 517 阅读 · 0 评论 -
Python Thread join() daemon()
# 自定义线程要执行的函数def test(*args): for info in args: print(threading.current_thread().getName() +" "+ info)if __name__ == '__main__': t_tuple = ("春","夏","秋","冬") # 创建协程对象,不传参 thread_1 = threading.Thread(target=test,args=t_tuple) #原创 2021-11-29 10:29:01 · 266 阅读 · 0 评论 -
Python 创建线程的两种方式
Python 创建协程的方式主要有以下两种Python3中提供了一个内置模块threating.Thred,可以非常方便的创建协程threading.Thread() 一般接收两个参数:线程函数名:线程执行的函数(任务),由我们自已定义,注意不要加();线程函数的参数:线程函数名所需的参数,以元组的形式传入。若不需要参数,可以不指定(如果元组就一个参数要加逗号)。使用Thread类的构造器创建线程# 自定义线程要执行的函数def test(par = 'jibu'): for info原创 2021-11-26 15:08:20 · 783 阅读 · 0 评论 -
Python进程和线程的概念理解
市面上常用的操作系统都支持同时运行多个任务,每个任务通常是一个程序,每一个运行中的程序就是一个进程,即进程是应用程序的执行示例.即操作系统几乎都支持多进程并发执行。这里提一下并发和并行概念:并发和并行是两个概念,并行是指同一时刻有多条指令在多个处理器上同时执行;并发是指同一时刻只能有一条指令执行,但是多个进程指令被快速轮动执行,使得在宏观上具有多个进程同时执行的效果。例如:在电脑上一边看电影,一边听歌,一边聊天,除此之外,每台电脑在运行时还有大量底层的支撑性程序在运行,这些进程看上去像是在同时工作。原创 2021-11-26 11:38:25 · 696 阅读 · 0 评论