码迷,mamicode.com
首页 > 系统相关 > 详细

0926 进程

时间:2016-09-26 12:29:00      阅读:247      评论:0      收藏:0      [点我收藏+]

标签:

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 进程

标签:

原文地址:http://www.cnblogs.com/fuckily/p/5908575.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!