一、回顾多继承的概念。

由于GIL(全局解释器锁)的存在,在python中无法实现真正的多线程(一个进程里的多个线程无法在cpu上并行执行),如果想充分的利用cpu的资源,在python中需要使用进程。

二、multiprocessing模块的简介。

multiprocessing是python中用来管理多进程的包,与threading用法非常类似,它主要使用multiprocessing.Process对象来创建一个进程对象,该进程可以运行在python的函数中。

该Process(进程)对象与Thread(线程)对象的用法基本相同,同样具有start,join,run之类的方法,此外,multiprocessing也具有event,Lock,Semaphore,Condition类,这些对象可以像多线程那样,通过参数传递给各个进程。

其用法与threading包中的同名类一致。所以,multiprocessing的很大一部份与threading使用同一套API,只不过换成了多进程。

三、多进程的调用方式。

方式1:

#!/usr/local/bin/python2.7

# -*- coding:utf-8 -*-

from multiprocessing import Process

import time

def func1(name):

print 'hello %s,%s' %(name,time.ctime())

time.sleep(1)

if __name__ == '__main__':

pro_list = []

for i in range(3):

p = Process(target=func1,args=str(i))

pro_list.append(p)

p.start()

for i in pro_list:

i.join()

print "ending...."

方式2:(通过类的方式来创建多进程。)

#!/usr/local/bin/python2.7

# -*- coding:utf-8 -*-

from multiprocessing import Process

import time

class myprocess(Process):

def __init__(self):

super(myprocess, self).__init__()

def run(self):

print "hello,%s,%s" %(self.name,time.ctime())

time.sleep(1)

if __name__ == '__main__':

pro_list = []

for i in range(3):

p = myprocess()

p.start()

pro_list.append(p)

for p in pro_list:

p.join()

print "ending!"

下面还有一个扩展示例,可以瞬间让你明白,父进程与子进程之间的关系。

#!/usr/local/bin/python2.7

# -*- coding:utf-8 -*-

from multiprocessing import Process

import time

import os

def info(title):

print "title:%s" %(title)

print "parent process:%s", os.getppid() #获得父进程的进程号也就是ppid

print "process id: %s", os.getpid() #获得当前进程的pid号

def func1(name):

info("func1")

print "hello %s" %(name)

if __name__ == '__main__':

info("main process")

time.sleep(1)

print "------------------"

p = Process(target=info,args=('su',))

p.start()

p.join()

输出结果:

title:main process

parent process:%s 40833  #主进程的父进程是pycharm,所以这个是pycharm的进程号

process id: %s 42454  #我们运行的py程序的进程号

------------------

title:su

parent process:%s 42454   #在主进程中又开了个子进程,所以这个子进程的父进程就是我们运行py文件的主进程号

process id: %s 42455  #子进程自己的pid。

三、Process类的常用属性以及方法的介绍。

  1. Process类在实例化对象的时候,都需要哪些参数?

Process([group [, target [, name [, args [, kwargs]]]]])

group:这个参数应该是指定一个进程组,这个参数的功能暂时还没有实现,所以必须是None(默认就是None)

target:这个进程所要执行的函数或者方法。

name:指定进程名 (也可以用来获取进程名)

args/kwargs:要传到函数里的参数。

2.关于进程对象的一些常用方法。

is_alive(): 返回这个进程是否在运行状态。

join(timeout):阻塞父进程,一直到这个子进程终止。

start():开启这个进程,等待cpu调度。

terminate() 直接对这个进程发起一个SIGTERM信号,立刻终止这个进程。

3.进程类的一些常用属性。

deamon (注意!这是一个property特殊属性,本质上是个函数)daemon属性用来创建一个守护进程。 (这个守护进程是用于守护父进程的,当父进程退出,这个守护进程也会退出。)

name  获得进程名。

pid 获得进程号。

转载于:https://blog.51cto.com/suhaozhi/1925631

11.python并发入门(part9 多进程模块multiprocessing基本用法)相关推荐

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

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

  2. 11.python并发入门(part4 死锁与递归锁)

    一.关于死锁. 死锁,就是当多个进程或者线程在执行的过程中,因争夺共享资源而造成的一种互相等待的现象,一旦产生了死锁,不加人工处理,程序会一直等待下去,这也被称为死锁进程. 下面是一个产生" ...

  3. 11.python并发入门(part5 event对象)

    一.引入event. 每个线程,都是一个独立运行的个体,并且每个线程的运行状态是无法预测的. 如果一个程序中有很多个线程,程序的其他线程需要判断某个线程的运行状态,来确定自己下一步要执行哪些操作. t ...

  4. 11.python并发入门(part3 多线程与互斥锁)

    一.锁的概念. 锁,通常被用来实现共享数据的访问,为每一个共享的数据,创建一个Lock对象(一把锁),当需要访问这个共享的资源时,可以调用acquire方法来获取一个锁的对象,当共享资源访问结束后,在 ...

  5. 11.python并发入门(part8 基于线程队列实现生产者消费者模型)

    一.什么是生产者消费者模型? 生产者就是生产数据的线程,消费者指的就是消费数据的线程. 在多线程开发过程中,生产者的速度比消费者的速度快,那么生产者就必须等待消费者把数据处理完,生产者才会产生新的数据 ...

  6. Python并发编程之threading模块

    Python并发编程之threading模块 threading 模块 1. Timer对象 2. Lock对象 3. RLock 4. 信号量和有边界的信号量 5. 事件 6. 条件变量 7. 使用 ...

  7. Python并发编程之多进程(二)

    十.进程同步 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理 ---------- ...

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

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

  9. 多进程模块multiprocessing

    multiprocessing模块就是跨平台版本的多进程模块,提供了⼀个Process类来代表一个进程对象 创建⼦进程时,只需要传⼊⼀个执⾏函数和函数的参数,创建⼀个 Process实例,⽤start ...

最新文章

  1. 虚拟机克隆以后出现“需要整合虚拟机磁盘”的解决方法
  2. Python 过滤字母和数字
  3. Ubuntu 12.04 x64 下安装 GStreamer+FFmpeg+Opencv
  4. 从外部CorDapp扩展和覆盖流
  5. opencv rect画旋转矩形_在opencv c中绘制旋转的矩形
  6. python层次聚类_python实现层次聚类
  7. windows下编译lua5.2
  8. python之虚拟聊天室服务器详解
  9. 苹果将在WWDC首日举行“现场特别活动” 邀请函抽签决定
  10. 使用国外服务器的注意事项
  11. ARM9开发板Qt环境的搭建
  12. 水晶头排线顺序及设备互联法则
  13. 概率统计Python计算:学生分布分位点计算
  14. 微信开启指纹支付功能 单账户每日限额5000元
  15. iPhone3G、N96、N95、i908E对比
  16. 姐姐半夜不睡觉,既然偷偷在被窝里偷看HTML基础⭐
  17. 瑞萨R78族Flash读写操作详细探讨
  18. springboot整合redis,使用redisTemplate实现简易秒杀功能,使用jmeter压力测试秒杀接口
  19. hadoop统计文件行数
  20. WIN10系统80端口被system占用解决办法笔记(PID=4)

热门文章

  1. 在自己的网站添加关注新浪关注按钮
  2. 用友公司Java面试题(含答案)
  3. 玩转ios友盟远程推送,16年5月图文防坑版
  4. OpenCV-Python:K值聚类
  5. ElasticSearch + xpack 使用
  6. 第一个spring boot应用
  7. 用Piranha来实现WEB的负载均衡
  8. 向下滚动页面导航悬浮
  9. Windows Embedded Standard开发初体验(四)
  10. Java网络编程基础(七)— RMI分布式网络编程