首页 > 代码库 > 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 进程