进程
- 进程和线程的对比
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 """
-
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')
-
子进程
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)
-
进程间的通信
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 """

浙公网安备 33010602011771号