文档章节

Python 多进程

C
 Claroja
发布于 2017/05/08 23:18
字数 852
阅读 12
收藏 0

1.Python 多进程

类型 CPU密集型操作 IO密集型操作 网络请求密集型操作
线性操作 94.91824996 22.46199995 7.3296
多线程操作 101.1700001 24.8605001 0.505333265
多进程操作 53.88999999 12.78400004 0.504500032

通过上表我们可以看到:

多线程在IO密集型的操作下似乎也没有很大的优势(也许IO操作的任务再繁重一些就能体现出优势),在CPU密集型的操作下明显地比单线程线性执行性能更差,但是对于网络请求这种忙等阻塞线程的操作,多线程的优势便非常显著了
多进程无论是在CPU密集型还是IO密集型以及网络请求密集型(经常发生线程阻塞的操作)中,都能体现出性能的优势。不过在类似网络请求密集型的操作上,与多线程相差无几,但却更占用CPU等资源,所以对于这种情况下,我们可以选择多线程来执行

构造方法 描述
target 执行的方法
name 进程名
args 执行方法的参数
实例方法 描述
is_alive() 查看进程是否正在运行
join() 阻塞进程
start() 开始进程
run() 被start()调用
terminate() 停止进程
属性 描述
name 进程名字
pid 进程编号
daemon 守护进程

2.例子
2.1 使用多线程运行函数

import multiprocessing as mp
def count():
    for i in range(1000):
        print(i)
#只有在本程序为主程序的时候运行接下来的代码
#每个python模块(python文件,也就是此处的test.py和import_test.py)都包含内置的#变量__name__,当运行模块被执行的时候,__name__等于文件名(包含了后缀.py);如果#import到其他模块中,则__name__等于模块名称(不包含后缀.py)。而“__main__”等于当#前执行文件的名称(包含了后缀.py)。进而当模块被直接执行时,__name__ == 'main'结#果为真。
if __name__ == "__main__":
#注意这里的target调用的函数是函数名称,不能带();另外Process第一个字母大写
    p1=mp.Process(target=count)
    p2=mp.Process(target=count)
    p1.start()
    p2.start()

在运行结果中我们可以看到这样的片段:
152
953
153
154
155
156
157
954
158
955
159
956
160
说明在执行第一个循环的进程中,并发开始执行了第二个进程,两个循环进程是同时进行的。

2.2 daemon

import multiprocessing as mp
def count1():
    for i in range(10):
        print(i)
def count2():
    for i in range(10):
        print(i*10)
if __name__ == "__main__":
    p1=mp.Process(target=count1)
    p2=mp.Process(target=count2)
#进程的属性一定要在进程开始前设置
    p1.daemon=True
    p1.start()
    p2.start()
    print("Done")

输出的结果为:
Done
0
10
20
30
40
50
60
70
80
90
我们可以看到主程序先运行结束,打印了“Done”,由于count1的进程没有设置保护进程,所以主程序结束后,count1进程也被终止了。但是,count2由于被设置了程度保护,所以count2进程并没有随着主程序的终止而终止。
2.3 lock
lock用来处理共享资源的访问,避免访问冲突
2.4 Semaphore
Semaphore限制访问数量
2.5 Event
Event用来实现进程间的同步通信
2.6 Queue
多进程安全队列,用于实现进程间的数据传递。
2.7 Pipe
2.8 Pool

参考文献:
http://www.cnblogs.com/kaituorensheng/p/4445418.html#_label3
http://python.jobbole.com/86822/

© 著作权归作者所有

C
粉丝 0
博文 128
码字总数 44892
作品 0
南京
私信 提问
(转载)Python进阶:聊聊IO密集型任务、计算密集型任务,以及多线程、多进程 - 笑虎的文章 - 知乎

Python进阶:聊聊IO密集型任务、计算密集型任务,以及多线程、多进程 - 笑虎的文章 - 知乎 https://zhuanlan.zhihu.com/p/24283040 Python进阶:聊聊IO密集型任务、计算密集型任务,以及多线...

avatus
2018/09/05
0
0
python多线程和多进程——python并行编程实验

工作中经常涉及到加速程序的运行,除了代码逻辑的优化,算法的优化之外,还经常使用的一招就是并发编程。至于python的并发编程这一块,笔者看到一些python圈的圈友们经常诟病python的全局解释...

王鹏你妹
05/29
0
0
一篇文章搞定Python多进程(全)

公众号:pythonislover 前面写了三篇关于python多线程的文章,大概概况了多线程使用中的方法,文章链接如下: 一篇文章搞懂Python多线程简单实现和GIL - https://mp.weixin.qq.com/s/Hgp-x-...

南山yrg
05/05
0
0
python高性能编程--002--全局解释器锁GIL

一、GIL基本概念 1.GIL即为gloabl interpreter lock,全局解释器锁。这个东西是在python解释器之一的cpython中引入的一个概念,因为我们现在常用的python解释器就是cpython这个解释器,故而G...

Ryan_snow
2018/06/26
0
0
Python怎么利用多核cpu

原文链接http://www.cnblogs.com/stubborn412/p/4033651.html def dead_loop(): def dead_loop(): {void DeadLoop() { while (true); } } from threading import Thread lib = cdll.LoadLibr......

dby_freedom
2018/05/06
0
0

没有更多内容

加载失败,请刷新页面

加载更多

四种解决Nginx出现403 forbidden 报错的方法

我是在在本地用虚拟机中通过yum安装nginx的,安装一切正常,但是访问时报403, 于是查看nginx日志,路径为/var/log/nginx/error.log。打开日志发现报错Permission denied,详细报错如下: 1....

dragon_tech
9分钟前
1
0
获取RestResultResponse返回的值

Springboot项目,需要调其他服务的接口,返回值类型是RestResultResponse 打断点的结果集是这个 打印出来的getData(): [{id=3336b624-8474-4dd9-bd5b-c7358687c877, paraNo=104, para=Postpo...

栾小糖
13分钟前
1
0
【小学】 生成10以内的加减法

#!/usr/bin/env python# coding: utf-8from random import randrange# 题目的最大数值R_MAX = 10# 生成的题目的数量R_PAGE = 70# 生成减法列表def get_sub_list():...

Tensor丨思悟
33分钟前
9
0
JavaScript设计模式——适配器模式

  适配器模式是设计模式行为型模式中的一种模式;   定义:   适配器用来解决两个已有接口之间不匹配的问题,它并不需要考虑接口是如何实现,也不用考虑将来该如何修改;适配器不需要修...

有梦想的咸鱼前端
40分钟前
3
0
Andorid SQLite数据库开发基础教程(1)

Andorid SQLite数据库开发基础教程(1) Android数据库访问方式 SQLite是Android系统默认支持的文件数据库。该数据库支持SQL语言,适合开发人员上手。本教程将讲解如何开发使用SQLite的Andro...

大学霸
43分钟前
3
0

没有更多内容

加载失败,请刷新页面

加载更多

返回顶部
顶部