加入收藏 | 设为首页 | 会员中心 | 我要投稿 南京站长网 (https://www.025zz.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 服务器 > 搭建环境 > Unix > 正文

进程和并发

发布时间:2022-11-06 14:31:41 所属栏目:Unix 来源:转载
导读: 我们已经讲过了什么是线程,那今天就来学习一下什么是进程,进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础

我们已经讲过了什么是线程,那今天就来学习一下什么是进程,进程(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()

进程与进程的通信机制_unix进程通信_实现进程到进程之间的通信

分别启动线程和进程,运行代码,查看电脑的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()) # 终止进程

实现进程到进程之间的通信_unix进程通信_进程与进程的通信机制

进程并发: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)

实现进程到进程之间的通信_unix进程通信_进程与进程的通信机制

也可以使用上下文管理的方式

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())

实现进程到进程之间的通信_进程与进程的通信机制_unix进程通信

守护进程实现(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()))

实现进程到进程之间的通信_进程与进程的通信机制_unix进程通信

参考:

(编辑:南京站长网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章