python多线程与多进程

##多进程与多线程

参考链接:http://www.yeayee.com/article-6597958-1.html

###多进程

+ python 中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。Python提供了非常好用的多进 程包multiprocessing,只需要定义一个函数,Python会完成其他所有事情。借助这个包,可以轻松完成从单进程到并发执行的转换。multiprocessing支持子进程、通信和共享数据、执行不同形式的同步,提供了Process、Queue、Pipe、Lock等组件。

+ 创建进程的类:Process([group [, target [, name [, args [, kwargs]]]]]),target表示调用对象,args表示调用对象的位置参数元组。kwargs表示调用对象的字典。name为别名。group实质上不使用。

+ 例程

import multiprocessing

import time

from test.test_threading_local import target

def worker_1(interval):

print("worker_1")

time.sleep(interval)
    
print("end worker_1")



def worker_2(interval):

print("worker_2")

time.sleep(interval)

print("end worker_2")



def worker_3(interval):

print("worker_3")

time.sleep(interval)

print("end worker_3")









if __name__ == '__main__':

p1 = multiprocessing.Process(target=worker_1,args=(2,))

p2 = multiprocessing.Process(target=worker_2,args=(3,))

p3 = multiprocessing.Process(target=worker_3,args=(4,))

p1.start()

p2.start()

p3.start()

print("The number of CPU is:" + str(multiprocessing.cpu_count()))

for p in multiprocessing.active_children():

print("child p.name:" + p.name + "tp.id"+str(p.pid))

print("END!!!!!!!!!!!!")


###多线程

+ python的多线程在同一时刻只会有一条线程跑在CPU里面,其他线程都在睡觉,这个就是因为传说中的GIL(全局解释锁)的存在。

+ 如果是一个计算为主的程序(专业一点称为CPU密集型程序),这一点确实是比较吃亏的,每个线程运行一遍,就相当于单线程再跑,甚至比单线程还要慢——CPU切换线程的上下文也是要有开销的。但是,如果是一个磁盘或网络为主的程序(IO密集型)就不同了。一个线程处在IO等待的时候,另一个线程还可以在CPU里面跑,有时候CPU闲着没事干,所有的线程都在等着IO,这时候他们就是同时的了,而单线程的话此时还是在一个一个等待的。我们都知道IO的速度比起CPU来是慢到令人发指的,python的多线程就在这时候发挥作用了。比方说多线程网络传输,多线程往不同的目录写文件,等等。

+ CPU密集型的程序用python来做,本身就不合适。跟C,Go,Java的速度比,实在性能差到没法说。我们之所以用python来做,只是因为开发效率超高,可以快速实现。python中要想利用好CPU,还是用多进程来做吧。或者,可以使用协程。

+ 在单核CPU下的多线程其实都只是并发,不是并行,并发和并行从宏观上来讲都是同时处理多路请求的概念。但并发和并行又有区别,并行是指两个或者多个事件在同一时刻发生;而并发是指两个或多个事件在同一时间间隔内发生。

+ 每个进程有各自独立的GIL,互不干扰,这样就可以真正意义上的并行执行,所以在python中,多进程的执行效率优于多线程(仅仅针对多核CPU而言)。

+ 多线程编程例程

import threading

from time import ctime,sleep

def music(func):

for i in range(2):

print("I was listening to music %s %s" %(func,ctime()))

sleep(1)


def movie(func):

for i in range(2):

print("I was at the movies! %s %s" %(func,ctime()))

sleep(5)

threads = []

t1 = threading.Thread(target=music,args=(u'爱情买卖',))

threads.append(t1)

t2 = threading.Thread(target=movie,args=(u'阿凡达',))

threads.append(t2)


if __name__ == '__main__':

for t in threads:

t.setDaemon(True)

t.start()

t.join()

print("all over %s" %ctime())

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值