Python并发、并行与异步编程
此专栏专门记录python的并发与并行相关的知识,threading, twisted, 协程等。
小宇不内向
广东OPPO移动通信有限公司
展开
-
python服务端口被占用时如何解决
1. 查出哪个进程占用端口netstat -ano|findstr :80832. 从截图可以看到,PID 13756 占用了8083端口,kill 掉13756进程即可。使用 taskkill 指令taskkill /? 可查看 taskkill 指令参数指令taskkill /F /PID13756 杀掉 PID 为13756 的进程...原创 2021-10-28 12:04:08 · 1458 阅读 · 0 评论 -
Python 进程间通信- Queue, Pipe, Manager
回顾线程间通信(Python多线程编程之线程间通信),线程间通信用共享变量和queue.Queue。但这两者都不能用于进程间通信。不同进程之间,变量就算同名也是位于不同的内存地址上,也是不同的变量。queue.Queue也不能用于进程间通信,将不同进程的变量put进queue.Queue对象中,会抛弃常。下面示例代码:from queue import Queuedef produce...原创 2019-10-31 15:29:33 · 458 阅读 · 0 评论 -
Python 多进程编程 ThreadPoolExecutor, multiprocessing
一、并发与并行的区别并发:一个时间段内,有几个程序在同一个CPU上运行,但是任意时刻只有一个程序在CPU上运行。 并行:并行是指任意时刻上,有多个程序同时运行在多个CPU上所有常说高并发,没有说高并行,因为CPU数量是有限的。二、多进程与多线程的区别对于耗 CPU 的操作,用多进程优于多线程,因为有 GIL 锁,不会常释放,耗 CPU 操作无法使用多线程。 多 IO 操作,常会释放 ...原创 2019-10-31 11:17:05 · 2386 阅读 · 0 评论 -
python线程池 ThreadPoolExecutor 使用详解
从Python3.2开始,标准库为我们提供了concurrent.futures模块,它提供了 ThreadPoolExecutor 和ProcessPoolExecutor两个类,实现了对threading和multiprocessing 的进一步抽象(这里主要关注线程池),不仅可以自动调度线程,还可以做到:主线程可以获取某一个线程(或者任务的)的状态,以及返回值。 当一个...原创 2019-10-30 16:40:19 · 48649 阅读 · 3 评论 -
Python 线程同步机制:Lock, RLock,Condition和 Semaphore
1.线程锁 Lock,得到一个锁对象lock,可以用lock.acquire()将全局变量锁起来,只允许当前上锁的线程操作;再调用lock.release()解锁,让其他线程有机会操作这个全局变量。from threading import Locktotal = 0lock = Lock()def add(): global lock global t...原创 2019-10-30 11:38:31 · 734 阅读 · 0 评论 -
Python多线程编程之线程间通信
python线程间通信,有两种常用的方法:1.共享变量:定义一个全局变量,然后在不同的线程函数中,使用global关键字声明为全局变量:detail_url_list = [] # 全局变量def get_detail_html(): # 爬取文章详情页 global detail_url_list # 用 global 声明为全局变量 ...原创 2019-10-29 10:06:51 · 1251 阅读 · 0 评论 -
Python 多线程编程threading
1. 创建多线程对象有两种方法可以创建线程对象:(1)直接实例化thread1 = threading.Thread(target=get_detail_html, args=("", ))thread2 = threading.Thread(target=get_detail_url, args=("", ))thread1.start()thread2.start()...原创 2019-10-28 16:20:33 · 189 阅读 · 0 评论 -
python线程中的 GIL 详解
1.什么是GIL GIL(Global Interpreter Lock) ,意思是全局解释锁。即在任意时刻只有一个线程在解释器中运行。对python虚拟机访问的控制由全局解释器锁GIL控制,正是这个锁来控制同一时刻只有一个线程能够运行,无法将多个线程映射到多个cpu上执行。可以通过下面的例子来更好的理解 GIL 。运行下面这段python程序,CPU占用率是多少?...原创 2019-10-26 17:07:14 · 411 阅读 · 0 评论 -
twisted 的 延迟(deferred)的概述与用法
1.deffered 延迟链:将多个回调加入延时链中,第一个回调函数用deffer.callback(a)调用,a是传入的一个参数,必须要有一个参数才能调用第一个回调函数。第二个回调使用第一个回调的结果调用。如果出现异常,将绕过回调链,所以每定一个回调用函数,都要让回调函数接受一个参数。# 创建回调函数,每个回调函数都要接受至少一个参数def myfun(a): input(...原创 2019-10-26 09:34:31 · 830 阅读 · 0 评论 -
Twisted 任务调度派遣之 scheduling:定时执行程序
本文以简单易懂的语言来记录关于twisted定时执行某个任务的方法:1.如果要让某个程序在 x秒之后执行,可以用 reactor.callLater()方法:# reactor.callLater() 在x秒之后启动f()函数def f(s): print("this will run 2 seconds after it was scheduled: %s" % s)...原创 2019-10-25 17:30:15 · 711 阅读 · 0 评论