16. python多进程总结

1. 启动多进程的方式

  1. os.fork 只支持Unix,不支持windows
  2. 使用multiprocessing模块: 创建Process的实例,传入任务执行函数作为参数
  3. 使用multiprocessing模块: 派生Process的子类,重写run方法
  4. 使用进程池Pool

2. 启动多进程注意

  1. multiprocessing是基于fork(),因为windows没有fork()函数但是可以通过在__main__中启动子进程来规避
  2. multiprocessing创建子进程时会在子进程空间中复制一份主进程的代码,全局变量在多个子进程之间不共享
  3. 多进程之间数据是隔离的

3. python守护进程

  1. 正常情况下,如果主进程代码执行完成,但是子进程还没有执行完成,则程序还不会退出,而是继续等待子进程。
  2. 当要实现子进程要随主进程结束而结束时就可以设置守护进程。
  3. 设置守护进程的方式是在start()之前设置 daemon = True
  4. p.terminate() 是终止一个进程,该代码执行后进程不是立刻结束,CPU还有一个调度的过程此时用p.is_alive()检查发现结果为True,time.sleep() 一秒后再用p.is_alive()检查会发现结果为False

4. python多进程锁

  1. Lock类与RLock类相同:由于进程之间随机调度:某进程可能执行n条后,CPU接着执行其他进程。为了多个进程同时操作一个内存中的资源时不产生混乱,我们使用锁。
  2. Lock类与RLock类的区别:无论是Lock还是RLock,提供的方法都非常简单,acquire和release。但是Lock和RLock的区别是什么呢?RLock允许在同一线程中被多次acquire。而Lock却不允许这种情况。注意:如果使用RLock,那么acquire和release必须成对出现,即调用了n次acquire,必须调用n次的release才能真正释放所占用的锁。

5. python多进程信号量-Semaphore

  1. 信号量Semaphore是一个计数器,控制对公共资源或者临界区域的访问量,信号量可以指定同时访问资源或者进入临界区域的进程数。每次有一个进程获得信号量时,计数器-1,若计数器为0时,其他进程就停止访问信号量,一直阻塞直到其他进程释放信号量。

6.python多进程事件

  1. 多进程中的事件Event-进程之间的状态标记通信,它是由进程设置的信号标志,如果信号标志为真,则其他进程等待直到信号解除
  2. Event对象实现了简单的进程通信机制,它提供了设置信号,清除信号,等待等用于实现进程间通信的方法
  3. Event对象创建时默认信号设置为False。False时会在wait()处阻塞,True时不阻塞

7. python多进程之队列

  1. IPC(Inter-Process Communication)进程之间通信
  2. 队列先进先出
  3. Queue()实例化是可以传一个参数代表队列上限,如果不传或传负数都表示队列没有限制。
  4. 当队列容量不够时会阻塞
  5. Queue可以创建共享的进程队列,Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递

8. python多进程之JoinableQueue

  1. JoinableQueue 与Queue一样也是multiprocessing模块中的一个类,也可以用于创建进程队列。
  2. JoinableQueue 创建可连接的共享进程队列,队列允许队列的消费者通知生产者,队列数据已被成功处理完成。通知过程是使用共享的信号和条件变量来实现的。

9. python多进程之Pipe

  1. Pipe返回2个连接对象(conn1, conn2),代表管道的两端,默认是双向通信的,即conn1和conn2都可以收发消息。
  2. Pipe是数据不安全的,所以如果是多个进程之间同时收发消息时,需要自己加锁以达到数据安全。
  3. 如果是生产者或消费者中都没有使用管道的某个端点,就应将它关闭。这也说明了为何在生产者中关闭了管道的输出端,在消费者中关闭管道的输入端。如果忘记执行这些步骤,程序可能在消费者中的recv()操作上挂起。
  4. 管道是由操作系统进行引用计数的,必须在所有进程中关闭管道后才能生成EOFError异常。因此,在生产者中关闭管道不会有任何效果,除非消费者也关闭了相同的管道端点

10. python多进程之Pool

  1. 在程序实际处理问题过程中,忙时会有成千上万的任务需要被执行,闲时可能只有零星任务。那么在成千上万个任务需要被执行的时候,我们就需要去创建成千上万个进程么?
  2. 首先,创建进程需要消耗时间,销毁进程也需要消耗时间。第二即便开启了成千上万的进程,操作系统也不能让他们同时执行,这样反而会影响程序的效率。因此我们不能无限制的根据任务开启或者结束进程。那么我们要怎么做呢?
  3. 这样就引入了进程池,进程池是指定义一个进程池,在里面放上固定数量的进程,有需求来了,就拿进程池中的一个进程来处理任务,等到处理完毕,进程并不关闭,而是将进程再放回进程池中继续等待任务。
  4. 如果有很多任务需要执行,进程池中的进程数量不够,任务就要等待之前的进程执行任务完毕归来,拿到空闲进程才能继续执行。也就是说,池中进程的数量是固定的,那么同一时间最多有固定数量的进程在运行。这样不会增加操作系统的调度难度,还节省了开闭进程的时间,也一定程度上能够实现并发效果。

11.python多进程之Manager

  1. Python中提供了强大的Manager类,专门用于实现多进程之间的数据共享;
  2. Manager类是数据不安全的;
  3. Mangaer类支持的类型非常多,如:value, Array, List, Dict, Queue, Lock等。
  4. Manager 类包含的常用方法和属性与Multiprocessing中其他常用类的方法属性一致。

12.python多进程之回调函数

  1. 需要回调函数的场景:进程池中任何一个任务一旦处理完了,就立即告知主进程:我好了额,你可以处理我的结果了。主进程则调用一个函数去处理该结果,该函数即回调函数
  2. 我们可以把耗时间(阻塞)的任务放到进程池中,然后指定回调函数(主进程负责执行),这样主进程在执行回调函数时就省去了I/O的过程,直接拿到的是任务的结果。
  3. 子进程执行返回的结果做为回调函数的参数传入。
  4. 回调函数是在主进程中执行的。回调函数适用于子进程数多且耗时时间长的场景。
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 217,542评论 6 504
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,822评论 3 394
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 163,912评论 0 354
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,449评论 1 293
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,500评论 6 392
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,370评论 1 302
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,193评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,074评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,505评论 1 314
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,722评论 3 335
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,841评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,569评论 5 345
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,168评论 3 328
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,783评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,918评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,962评论 2 370
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,781评论 2 354