首页 > 编程语言 > 详细

python基础-线程和进程

时间:2015-10-31 22:57:24      阅读:324      评论:0      收藏:0      [点我收藏+]

 

 

------------------

一、多进程

  线程是最小的执行单元,而进程由至少一个线程组成。

  python中os模块中的fork()可以复制当前进程,并且子进程返回0,父进程返回子进程的PID。那么子进程可以用getppid()得到父进程的PID :

# multiprocessing.py
import os

print Process (%s) start... % os.getpid()
pid = os.fork()      #windows系统下没有fork()调用,so,只能在posix的系统下执行(Unix,Linux,Mac,BSD...)
if pid==0:
    print I am child process (%s) and my parent is %s. % (os.getpid(), os.getppid())
else:
    print I (%s) just created a child process (%s). % (os.getpid(), pid)
Process (876) start...
I (876) just created a child process (877).
I am child process (877) and my parent is 876.

  常见的Apache服务就是由父进程监听端口,然后fork()出子进程来处理http请求.

  1、multiprocessing:提供跨平台的多进程支持

    Python中有multiprocessing模块提供跨平台的多进程支持:

from multiprocessing import Process
import os

# 子进程要执行的代码
def run_proc(name):
    print Run child process %s (%s)... % (name, os.getpid())

if __name__==__main__:
    print Parent process %s. % os.getpid()
    p = Process(target=run_proc, args=(test,))
    print Process will start.
    p.start()    #启动进程
    p.join()     #等待子进程结束后再继续往下运行,通常用于进程间的同步。
    print Process end.

 

  2、Pool :进程池.

    要启动大量的子进程,可以用进程池的方式批量创建子进程:

from multiprocessing import Pool
import os, time, random

def long_time_task(name):
    print Run task %s (%s)... % (name,os.getpid())
    start = time.time()
    time.sleep(random.random() * 3)  #随机暂停
    end = time.time()
    print Task %s runs %0.2f seconds. % (name,(end-start))

if __name__==__main__:
    print Parent process %s. % os.getpid()
    p = Pool()      #创建一个进程池.
    for i in range(5):
        p.apply_async(long_time_task,args=(i,))  #将要执行的函数加入进程池
    print Waiting for all subprocesses done....
    p.close()
    p.join()    #等待所有子进程执行完毕,之前必须先调用close(),然后不能添加新的Process.
    print All subprocessesdone.

 

Parent process 1356.
Waiting for all subprocesses done....
Run task 3 (6296)...
Task 3 runs 0.52 seconds.
Run task 2 (4244)...
Task 2 runs 1.58 seconds.
Run task 0 (5720)...
Task 0 runs 1.48 seconds.
Run task 1 (7692)...
Task 1 runs 2.55 seconds.
Run task 4 (1860)...
Task 4 runs 2.96 seconds.
All subprocessesdone.
[Finished in 3.3s]

 

  Pool的默认大小是CPU的核数,当然,你也可以改变:

p = Pool(5)

  3、进程间通信:

    multiprocessing模块包装了底层的机制,提供了QueuePipes等多种方式来交换数据,以Queue为例:参考:这里

from multiprocessing import Process,Queue
import os, time, random

#写数据进程执行的代码:
def write(q):
    for value in [A,B,C]:
        print Put %s to queue...  % value
        q.put(value)
    time.sleep(random.random())

#读数据进程执行的代码:
def read(q):
    while True:
        if q.empty():
            return
        else:
            value = q.get()
            print value,from Queue

if __name__==__main__:
    #父进程创建Queue,并传给各个子进程:
    q = Queue()
    pw = Process(target=write,args=(q,))
    pr = Process(target=read,args=(q,))
    #启动子进程pw,写入:
    pw.start()
    #启动子进程pr,读取:
    pr.start()
    #等待pw,pr结束:    
    pw.join()
    pr.terminate()

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

 

sdf

  

python基础-线程和进程

原文:http://www.cnblogs.com/xccnblogs/p/4926303.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!