进程和并发
我们已经讲过了什么是线程,那今天就来学习一下什么是进程,进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。 进程是正在运行的程序的实例,简单的说就是比如我们自己在python文件中写了一些代码,这叫做程序,而运行这个python文件的时候就叫做进程 什么是并发 那什么是并发呢,并发就是在某个时间段内,两件或两件以上的事件轮流交替使用某一资源,其目的是提高效率; 需要注意的是并发和并行的区别: multiprocess模块 Python中提供multiprocess模块实现多进程并发unix进程通信,我们来看一下multiprocess模块的使用,通过一个实例来对比多线程和多进程程序运行对CPU的使用情况 import multiprocessing import threading def worker(): number = 0 for i in range(10000000): number += 1 print('循环次数:{} number:{}'.format(i+1, number)) if __name__ == '__main__': for i in range(4): # 创建线程 threading.Thread(target=worker, name='thread worker {}'.format(i)).start() # 创建进程 multiprocessing.Process(target=worker, name='process worker {}'.format(i)).start() 分别启动线程和进程,运行代码,查看电脑的CPU的使用率,发现多进程占用内存多,切换复杂,CPU利用率低,多线程占用内存少,切换简单,CPU利用率高; 进程的一些对象方法 import multiprocessing import threading import time def worker(): number = 0 for i in range(10000000): number += 1 time.sleep(0.1) print(multiprocessing.current_process().name) # 获取当前进程的名称 print('循环次数:{} number:{}'.format(i+1,number )) if __name__ == '__main__': for i in range(4): process = multiprocessing.Process(target=worker, name='process worker {}'.format(i)) process.start() print(process.pid) # 获取进程的pid print(process.exitcode) # 获取退出状态码 print(process.name) # 获取进程名称 time.sleep(30) print(process.terminate()) # 终止进程 进程并发:concurrent模块 from concurrent.futures import ProcessPoolExecutor import requests def fetch_url(url): result = requests.get(url=url, ) return result.text if __name__ == '__main__': # 创建10个线程队列的线程池 pool = ProcessPoolExecutor(10) # 获取任务返回对象 a = pool.submit(fetch_url, 'http://www.baidu.com') # 取出返回的结果 x = a.result() print(x) 也可以使用上下文管理的方式 from concurrent.futures import ProcessPoolExecutor import requests def fetch_url(url): result = requests.get(url=url, ) return result.text if __name__ == '__main__': with ProcessPoolExecutor(max_workers=10) as pool: a = pool.submit(fetch_url, 'http://www.9xkd.com') print(a.result()) 守护进程实现(POSIX兼容) 守护进程实现的步骤: 对 os.fork( )的理解: import os pid = os.fork() print(pid) if pid == 0: print("我是子进程 pid={}, parent_pid={}".format(os.getpid(), os.getppid())) else: print("我是父进程 pid={}, parent_pid={}".format(os.getpid(), os.getppid())) 参考: (编辑:晋中站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |