0926 进程

Posted

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 进程的主要内容,如果未能解决你的问题,请参考以下文章

0926-----homework

0926-----homework

java 简单的代码片段,展示如何将javaagent附加到运行JVM进程

代码片段:Shell脚本实现重复执行和多进程

0926-----homework(4,5,6)

0926-UIWebView