Python 多进程

1.Python 多进程

类型CPU密集型操作IO密集型操作网络请求密集型操作
线性操作94.9182499622.461999957.3296
多线程操作101.170000124.86050010.505333265
多进程操作53.8899999912.784000040.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/

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值