11.python并发入门(part9 多进程模块multiprocessing基本用法)
一、回顾多继承的概念。
由于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类的常用属性以及方法的介绍。
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基本用法)相关推荐
- 【Python成长之路】python并发学习:多进程与多线程的用法及场景介绍
刚开始学习Python 并发查询或者并发读写时,看到大神们说,多线程是python的鸡肋,要学就学多进程.好吧,我连多线程怎么写都不知道呢. 因此,就写了以下的示例代码.代码目的是将test.txt文 ...
- 11.python并发入门(part4 死锁与递归锁)
一.关于死锁. 死锁,就是当多个进程或者线程在执行的过程中,因争夺共享资源而造成的一种互相等待的现象,一旦产生了死锁,不加人工处理,程序会一直等待下去,这也被称为死锁进程. 下面是一个产生" ...
- 11.python并发入门(part5 event对象)
一.引入event. 每个线程,都是一个独立运行的个体,并且每个线程的运行状态是无法预测的. 如果一个程序中有很多个线程,程序的其他线程需要判断某个线程的运行状态,来确定自己下一步要执行哪些操作. t ...
- 11.python并发入门(part3 多线程与互斥锁)
一.锁的概念. 锁,通常被用来实现共享数据的访问,为每一个共享的数据,创建一个Lock对象(一把锁),当需要访问这个共享的资源时,可以调用acquire方法来获取一个锁的对象,当共享资源访问结束后,在 ...
- 11.python并发入门(part8 基于线程队列实现生产者消费者模型)
一.什么是生产者消费者模型? 生产者就是生产数据的线程,消费者指的就是消费数据的线程. 在多线程开发过程中,生产者的速度比消费者的速度快,那么生产者就必须等待消费者把数据处理完,生产者才会产生新的数据 ...
- Python并发编程之threading模块
Python并发编程之threading模块 threading 模块 1. Timer对象 2. Lock对象 3. RLock 4. 信号量和有边界的信号量 5. 事件 6. 条件变量 7. 使用 ...
- Python并发编程之多进程(二)
十.进程同步 进程之间数据不共享,但是共享同一套文件系统,所以访问同一个文件,或同一个打印终端,是没有问题的, 而共享带来的是竞争,竞争带来的结果就是错乱,如何控制,就是加锁处理 ---------- ...
- python并发编程之多进程、多线程、异步和协程
转载 自 tyomcat: https://www.cnblogs.com/tyomcat/p/5486827.html 一.多线程 多线程就是允许一个进程内存在多个控制权,以便让多个函数同时处于激活 ...
- 多进程模块multiprocessing
multiprocessing模块就是跨平台版本的多进程模块,提供了⼀个Process类来代表一个进程对象 创建⼦进程时,只需要传⼊⼀个执⾏函数和函数的参数,创建⼀个 Process实例,⽤start ...
最新文章
- 虚拟机克隆以后出现“需要整合虚拟机磁盘”的解决方法
- Python 过滤字母和数字
- Ubuntu 12.04 x64 下安装 GStreamer+FFmpeg+Opencv
- 从外部CorDapp扩展和覆盖流
- opencv rect画旋转矩形_在opencv c中绘制旋转的矩形
- python层次聚类_python实现层次聚类
- windows下编译lua5.2
- python之虚拟聊天室服务器详解
- 苹果将在WWDC首日举行“现场特别活动” 邀请函抽签决定
- 使用国外服务器的注意事项
- ARM9开发板Qt环境的搭建
- 水晶头排线顺序及设备互联法则
- 概率统计Python计算:学生分布分位点计算
- 微信开启指纹支付功能 单账户每日限额5000元
- iPhone3G、N96、N95、i908E对比
- 姐姐半夜不睡觉,既然偷偷在被窝里偷看HTML基础⭐
- 瑞萨R78族Flash读写操作详细探讨
- springboot整合redis,使用redisTemplate实现简易秒杀功能,使用jmeter压力测试秒杀接口
- hadoop统计文件行数
- WIN10系统80端口被system占用解决办法笔记(PID=4)