概述
多线程与多进程的使用场景
io 操作不占用CPU(从硬盘、从网络、从内存读数据都算io)
计算占用CPU(如1+1计算)
python中的线程是假线程,不同线程之间的切换是需要耗费资源的,因为需要存储线程的上下文,不断的切换就会耗费资源。。
python多线程适合io操作密集型的任务(如socket server 网络并发这一类的);
python多线程不适合cpu密集操作型的任务,主要使用cpu来计算,如大量的数学计算。
那么如果有cpu密集型的任务怎么办,可以通过多进程来操作(不是多线程)。
假如CPU有8核,每核CPU都可以用1个进程,每个进程可以用1个线程来进行计算。
进程之间不需要使用gil锁,因为进程是独立的,不会共享数据。
进程可以起很多个,但是8核CPU同时只能对8个任务进行操作。
多进程
测试多进程
import multiprocessing
import time
def run(name):
time.sleep(2)
print ('heelo',name)
if __name__ == '__main__':
for i in range(10): #起了10个进程
p = multiprocessing.Process(target=run,args=('bob%s' %i,))
p.start()
执行结果:
heelo bob1
heelo bob0
heelo bob2
heelo bob3
heelo bob5
heelo bob4
heelo bob6
heelo bob7
heelo bob8
heelo bob9
##2秒左右就执行完成了,有几核CPU,同时就可以处理几个进程;当然要考虑你的电脑还开启了N多个其他应用程序,不过CPU计算比较快。
import multiprocessing
import time,threading
def thread_run():
print (threading.get_ident()) #get_ident获取当前线程id
def run(name):
time.sleep(2)
print ('heelo',name)
t = threading.Thread(target=thread_run,)
#在每个进程中又起了1个线程
t.start()
if __name__ == '__main__':
for i in range(10):
#起了10个进程
p = multiprocessing.Process(target=run,args=('bob%s' %i,))
p.start()
执行结果:
heelo bob0
16684
heelo bob1
15052
heelo bob2
15260
heelo bob3
6192
heelo bob4
6748
heelo bob7
13980
heelo bob5
6628
heelo bob6
3904
heelo bob9
2328
heelo bob8
17072
import os
def info(title):
print(title)
print('module name:', __name__)
print('parent process:', os.getppid())
#获取父进程的id
print('process id:', os.getpid())
#获取自身的id
print("nn")
def f(name):
info('