Python并发机制的实现(一) —— 多进程
Unix/Linux系统调用实现多进程(Windows系统不支持)
Unix/Linux操作系统提供了一个fork()系统调用,它非常特殊。普通的函数调用,调用一次,返回一次,但是fork()调用一次,返回两次,因为操作系统自动把当前进程(称为父进程)复制了一份(称为子进程),然后,分别在父进程和子进程内返回。

子进程永远返回0,而父进程返回子进程的ID。这样做的理由是,一个父进程可以fork出很多子进程,所以,父进程要记下每个子进程的ID,而子进程只需要调用getppid()就可以拿到父进程的ID。

#coding=utf-8
import os
import time

pid = os.fork()

#子进程
if pid==0:
while True:
print "child process {}".format(os.getpid())
time.sleep(2)
#父进程
else:
while True:
print "parent process {}".format(os.getppid())
time.sleep(2)

运行结果:

parent process 3614
child process 3761
child process 3761
parent process 3614
child process 3761
parent process 3614
^\退出 (核心已转储)

有了fork调用,一个进程在接到新任务时就可以复制出一个子进程来处理新任务,常见的Apache服务器就是由父进程监听端口,每当有新的http请求时,就fork出子进程来处理新的http请求。

multiprocessing模块
使用multiprocessing模块可以兼容windows操作系统,具体可见源码中python2.7中multiprocessing下的forking.py

#coding=utf-8
import time
import os
from multiprocessing import Process

def p1():
while True:
for i in range(5):
print 'pro1' + ' ' + str(os.getpid())
time.sleep(2)

def p2(name):
while True:
for i in range(5):
print name + ' ' + str(os.getpid())
time.sleep(2)

pro1 = Process()
pro2 = Process(target=p2, args=("pro2",))
#重写run函数为p1
pro1.run = p1
pro2.start()
pro2.start()
pro1.join()
pro2.join()

!注意其中的run函数,在python2.7multiprocessing模块中的源码为

def run(self):
'''
Method to be run in sub-process; can be overridden in sub-class
'''
#如果参数中传入目标函数则运行目标函数
if self._target:
self._target(*self._args, **self._kwargs)

分析源码可知创建进程实例后调用start方法启动线程通过一系列异常检测后将自动调用run方法

join方法是用来等待指定子进程的结束,再结束主进程即父进程,避免僵尸进程的产生

Pool模块(进程池)
Pool可以提供指定数量的进程,供用户调用,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来它.进程池可以让你跑满多核CPU,而且使用方法非常简单.

#coding=utf-8

from multiprocessing import Pool
import time

def f(x):
for i in range(10):
print i,'-----------',x
time.sleep(1)

def main():
#控制进程池的大小为4个进程(可以自行改动测试)
pool = Pool(processes=4)
for x in range(10):
#添加进程入进程池,注意加"_async",apply为阻塞版本,参数分别为target和args
result = pool.apply_async(f,(x*10,))
pool.close()
pool.join()
if result.successful():
print 'successful'

if __name__ == "__main__":
main()

运行此程序发现每次最多只有四个进程并行执行,运行结果如下:

0 ----------- 0
0 ----------- 10
0 ----------- 20
0 ----------- 30
1 ----------- 0
1 ----------- 10
1 ----------- 30
1 ----------- 20
2 ----------- 0
2 ----------- 10
2 ----------- 20
2 ----------- 30
...
8 ----------- 90
8 ----------- 80
9 ----------- 80
9 ----------- 90
successful
---------------------
作者:Always0nTheWay
来源:CSDN
原文:https://blog.csdn.net/wukai_std/article/details/53268006
版权声明:本文为博主原创文章,转载请附上博文链接!

转载于:https://www.cnblogs.com/sunmoon1993/p/10036465.html

Python并发机制的实现(一)——多进程相关推荐

  1. Python并发编程之:多进程

    一 multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分地使用多核CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程.P ...

  2. python并发编程之多进程、多线程、异步和协程

    转载 自 tyomcat: https://www.cnblogs.com/tyomcat/p/5486827.html 一.多线程 多线程就是允许一个进程内存在多个控制权,以便让多个函数同时处于激活 ...

  3. Python并发编程系列之多进程(multiprocessing)

    1 引言 本篇博文主要对Python中并发编程中的多进程相关内容展开详细介绍,Python进程主要在multiprocessing模块中,本博文以multiprocessing种Process类为中心 ...

  4. python并发编程之semaphore(信号量)_python 之 并发编程(守护进程、互斥锁、IPC通信机制)...

    9.5 守护进程 主进程创建守护进程 其一:守护进程会在主进程代码执行结束后就立即终止 其二:守护进程内无法再开启子进程,否则抛出异常:AssertionError: daemonic process ...

  5. Python并发编程之多进程(一)

    一.什么是进程 进程:正在进行的一个过程或者说一个任务.而负责执行任务则是cpu. 进程是资源分配的基本单位 进程有:代码段,数据段,进程控制块(PCB)组成 二.进程与程序的区别 程序仅仅只是一堆代 ...

  6. 【Python成长之路】python并发学习:多进程与多线程的用法及场景介绍

    刚开始学习Python 并发查询或者并发读写时,看到大神们说,多线程是python的鸡肋,要学就学多进程.好吧,我连多线程怎么写都不知道呢. 因此,就写了以下的示例代码.代码目的是将test.txt文 ...

  7. python 并发编程 多进程 目录

    python multiprocessing模块 介绍 python 开启进程两种方法 python 并发编程 查看进程的id pid与父进程id ppid python 并发编程 多进程 Proce ...

  8. python并发编程:协程asyncio、多线程threading、多进程multiprocessing

    python并发编程:协程.多线程.多进程 CPU密集型计算与IO密集型计算 多线程.多进程与协程的对比 多线程 创建多线程的方法 多线程实现的生产者-消费者爬虫 Lock解决线程安全问题 使用线程池 ...

  9. 【2021最新版】Python 并发编程实战,用多线程、多进程、多协程加速程序运行

    [2021最新版]Python 并发编程实战,用多线程.多进程.多协程加速程序运行 视频地址:https://www.bilibili.com/video/BV1bK411A7tV/ P1 Pytho ...

  10. Python Gevent – 高性能的 Python 并发框架

    From:http://www.xuebuyuan.com/1604603.html Gevent 指南(英文):http://sdiehl.github.io/gevent-tutorial Gev ...

最新文章

  1. 关于湖北工业大学图书馆联网配置的方法
  2. 管道命令和xargs的区别(经典解释)
  3. GeneratedKeyHolder的作用:获得新建主键值
  4. netty 压缩比_使Netty 4中的HTTP内容压缩工作
  5. weblogic创建域后启动不了_摩托车淋雨后启动不了什么原因?如何解决?
  6. 看这玩意复习你还会挂科?《网络原理篇》
  7. 深度残差收缩网络:(三)网络结构
  8. Linux下部署ASP.NET服务连接oracle遇到的问题记录
  9. 在ubuntu下面安装glew
  10. 大数据是如何改变零售行业的
  11. 微信小程序自定义Modal弹框
  12. 新iPhoneSE定价较低,置国产旗舰手机于尴尬境地!
  13. python使用金山词霸的翻译功能
  14. Python面向对象版学员管理系统
  15. 怎么在线压缩PDF文件?常见途径说明
  16. 离线安装python库
  17. 金仓数据库KingbaseES表空间介绍
  18. 0基础学RS(一)Packet Tracer 思科模拟器的使用以及下载
  19. 看大族电机如何用机器人带领我们进入工业4.0时代|镁客网M-TECH AI助力中国智造产业论坛...
  20. 编写一个脚本,对至少三个以上记事本窗口做相同操作,对任意一个窗口进行手动操作,其余窗口由脚本执行相同步骤的键鼠操作,记得是键盘操作+鼠标操作。

热门文章

  1. 系统简单的UIImagePickerController
  2. bitmap格式分析(转)
  3. 获取批量导入数据后,所产生所有自增ID的值
  4. Python字符串处理的8招秘籍
  5. 李航:做本质的、严谨的、有意思的研究,纪念我的导师长尾真教授
  6. NLP领域,哪些综述性的文章值得推荐?
  7. 从零实现深度学习框架——理解正则化(一)
  8. LeetCode刷题——392. 判断子序列
  9. 你的烂代码终于有了解决方案
  10. 选书不迷茫,国内原创佳作推荐,附赠神级优惠码༼⍤༽