首页 > 代码库 > 0926 进程
0926 进程
io操作不占用CPU,从内存、磁盘都读写数据是不占用CPU的;涉及计算的会占用CPU。
python多线程不适合cpu密集操作型的任务,适合io操作密集型的任务。
所以,如果任务涉及IO较多,那就适合多线程;如果涉及的计算较多,那就不适合多线程,不然cpu会一直切换上下文,反而降低效率。
所以cpu密集操作型的任务就用到了多进程。
进程之间的数据不共享,所以就不涉及锁的问题了;8核cpu,起8个以上进程,每个进程起N个线程,就利用了多核的优势。
1.多进程multiprocessing
进程的语法与线程类似;进程内可以启动线程。
1.1 创建进程
import multiprocessingimport threadingimport timedef threading_run(name): print(‘threading:{}‘.format(name))def run(name): time.sleep(2) t = threading.Thread(target=threading_run,args=(name,)) t.start() print(‘name:{}‘.format(name)) for i in range(10): p = multiprocessing.Process(target=run,args=(‘zhang‘,)) #创建进程 p.start() #启动进程
1.2 下例演示进程间关系
#!/usr/bin/env pythonfrom multiprocessing import Processimport os def info(title): print(title) print(‘module name:‘, __name__) print(‘parent process:‘, os.getppid()) #打印父进程PID print(‘process id:‘, os.getpid()) #打印当前进程PID print("\n\n") def f(name): info(‘function f‘) print(‘hello‘, name) if __name__ == ‘__main__‘: info(‘main process line‘) p = Process(target=f, args=(‘bob‘,)) p.start() p.join()#结果:main process linemodule name: __main__parent process: 3910process id: 4810function fmodule name: __main__parent process: 4810process id: 4816hello bob
上面结果所示,主进程同样有个父PID 3910,这是因为在linux里(在windows里貌似也一样)任何进程都是由一个父进程启动的,就好像init进程是所有进程的父进程那样。
主进程的PID是4810,所以子进程的父进程也是4810,子进程的PID是4816。
1.3 进程间通讯
有几种方式实现,但本质都是找一个“媒婆”在中间传话。
1.3.1 进程队列
普通队列(import queue;q = queue.Queue)被称为线程队列,线程可以共享数据,但是不同进程是不能共享数据的;
进程队列(from multiprocessing import Process,Queue;q = Queue())使不同进程可以共享队列里的数据,如下:
from multiprocessing import Process,Queueimport timedef run1(q): print(‘run1‘) q.put([1,2,3])def run2(q): print(‘run2‘) print(q.get()) #p2进程获取p1进程put的队列数据 if __name__ == ‘__main__‘: q = Queue() p1 = Process(target=run1,args=(q,)) #创建一个进程 p1.start() p2 = Process(target=run2,args=(q,)) #创建另一个进程 p2.start()#结果:run1run2[1, 2, 3]
0926 进程
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。