进程

 

  • 进程和线程的对比
    1
    """ 2 进程: 3 优点;可以同时被多个cpu处理(有几核就可以同时处理几个线程) 4 缺点:消耗内存资源 5 6 线程: 7 一个进程有多个线程,线程相当于进程的子任务 8 优点:共享资源,io操作时(不利用CPU),可以并发 9 缺点:抢占资源 10 11 io密集:多线程 12 计算密集:多进程 13 14 """
  • multiprocessing
    windows下的多进程模块
 1 """
 2 multiprocessing
 3 windows下的多进程模块
 4 multiprocessing 模块提供一个process类来表示一个进程对象
 5 """
 6 from multiprocessing import Process
 7 import os
 8 
 9 # 子进程要执行的代码
10 def run_proc(name):
11     # os.getpid():获取当前线程ID
12     print("Run child process %s(%s)..."%(name, os.getpid()))
13 
14 
15 if __name__ == '__main__':
16     print('Parent process %s'  % os.getpid())
17     # 为run_proc这个对象创建进程,传入的参数为test
18     p = Process(target = run_proc,args = ('test',))
19     print('Child process will start..')
20     # start开启进程
21     p.start()
22     # join()方法可以等待子进程结束后再继续往下执行
23     # 即等子进程执行完Run child process test(10160)...后,再往下执行Child process end
24     p.join()
25     print('Child process end')
26 
27     """
28     有join方法时:
29         Parent process 9300
30         Child process will start..
31         Run child process test(1060)...
32         Child process end
33     无join方法时:
34         Parent process 6104
35         Child process will start..
36         Child process end
37         Run child process test(8360)...
38     """
View Code
  • pool进程池
 1 """
 2 pool进程池
 3 """
 4 from multiprocessing import Pool
 5 import os,time,random
 6 
 7 
 8 def long_time_task(name):
 9     print('Run task %s(%s)...'% (name,os.getpid()))
10     start = time.time()
11     time.sleep(random.random()*3)
12     end = time.time()
13     print('Task %s runs %0.2f seconds'%(name,(end - start)))
14 if __name__ =='__main__':
15     print('Parent process %s..' %os.getpid())
16     p = Pool(5)  #空参默认开4个进程
17     for i in range(5):
18         p.apply_async(long_time_task,args=(i,))
19     print('Waiting for all subprocesses done...')
20     p.close()
21     # 对Pool对象调用join(),方法会等待所有子进程执行完毕,
22     # 调用join(),之前必须先调用close(),
23     # 调用close()之后就不能继续添加新的Process了。
24     p.join()
25     print('All subprocesses done')
View Code
  • 子进程
    subprocess模块

 

 1 """
 2 子进程
 3 subprocess模块
 4 """
 5 import subprocess
 6 
 7 # 下面的例子演示了如何在Python代码中运行命令
 8 # 即开启一个子进程来执行nslookup www.python.org
 9 print('$ nslookup www.python.org')
10 r = subprocess.call(['nslookup','www.python.org'])
11 print('Exit code:',r)
View Code

 

  • 进程间的通信
 1 """
 2 进程间的通信
 3 ython的multiprocessing模块包装了底层的机制,提供了Queue、Pipes等多种方式来交换数据。
 4 """
 5 from multiprocessing import Process,Queue
 6 import os,time,random
 7 
 8 # 写数据进程执行的代码
 9 def write(q):
10     print('Process to write: %s'% os.getpid())
11     for value in['A','B','C']:
12         print('Put %s to queue...'% value)
13         q.put(value)
14         time.sleep(random.random())
15 
16 # 读数据进程执行的代码
17 def read(q):
18     print('Process to read:%s'%os.getpid())
19     while True:
20         value = q.get(True)
21         print('Get %s from queue..'%value)
22 
23 if __name__ =='__main__':
24     # 父进程创建Queue,并传给各个子进程
25     q = Queue()
26     pw = Process(target=write,args=(q,))
27     pr = Process(target=read,args=(q,))
28     # 启动子进程pw,写入
29     pw.start()
30     # 启动子进程pr,读取
31     pr.start()
32     # 等待pw结束
33     pw.join()
34     # pr进程里是死循环,无法等待其结束,只能强行终止
35     pr.terminate()
36 
37 
38 """
39 random.random
40 random.random()用于生成一个0到1的随机符点数: 0 <= n < 1.0
41 random.uniform
42   random.uniform的函数原型为:random.uniform(a, b),
43 用于生成一个指定范围内的随机符点数,两个参数其中一个是上限,一个是下限。如果a > b,
44 则生成的随机数n: a <= n <= b。如果 a <b, 则 b <= n <= a。
45 random.randint
46   random.randint()的函数原型为:random.randint(a, b),用于生成一个指定范围内的整数。
47 其中参数a是下限,参数b是上限,生成的随机数n: a <= n <= b
48 """
View Code

 

posted @ 2017-05-11 00:14  yangyongbo  阅读(64)  评论(0)    收藏  举报