0926 进程
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了0926 进程相关的知识,希望对你有一定的参考价值。
io操作不占用CPU,从内存、磁盘都读写数据是不占用CPU的;涉及计算的会占用CPU。
python多线程不适合cpu密集操作型的任务,适合io操作密集型的任务。
所以,如果任务涉及IO较多,那就适合多线程;如果涉及的计算较多,那就不适合多线程,不然cpu会一直切换上下文,反而降低效率。
所以cpu密集操作型的任务就用到了多进程。
进程之间的数据不共享,所以就不涉及锁的问题了;8核cpu,起8个以上进程,每个进程起N个线程,就利用了多核的优势。
1.多进程multiprocessing
进程的语法与线程类似;进程内可以启动线程。
1.1 创建进程
import multiprocessing import threading import time def 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 python from multiprocessing import Process import 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 line module name: __main__ parent process: 3910 process id: 4810 function f module name: __main__ parent process: 4810 process id: 4816 hello 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,Queue import time def 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() #结果: run1 run2 [1, 2, 3]
以上是关于0926 进程的主要内容,如果未能解决你的问题,请参考以下文章