Python语法学习之进程的创建与常用方法详解
1. 前言
进程是操作系统进行任务调度的基本单位。在多任务环境下,同时执行多个进程可以提高运行效率。Python中通过multiprocessing
模块来创建和管理进程。
本篇攻略将详细讲解如何在Python中创建进程以及常见的进程操作方法。
2. 进程的创建
Python中可以通过multiprocessing
模块来创建进程。在multiprocessing
模块中,可以使用Process
类来创建进程。
import multiprocessing
def func():
print('This is a child process.')
if __name__ == '__main__':
p = multiprocessing.Process(target=func)
p.start()
p.join()
print('This is the main process.')
代码说明:
- 在代码中先导入了
multiprocessing
模块。 - 定义了一个名为
func
的函数作为子进程要执行的任务。 - 判断当前代码块是否在主模块中运行,以确保子进程在启动时不会重复运行。
- 创建一个名为
p
的Process
对象,指定子进程要执行的任务为func
。 - 启动子进程。
- 让主进程等待子进程执行完毕。
- 打印出一条提示信息,说明主进程在子进程执行完毕后继续执行。
3. 进程的常用方法
3.1 进程的启动和终止
start()
:启动进程。join([timeout])
:等待进程执行结束,如果设置了timeout
参数,则等待指定时间后结束等待。terminate()
:强制终止进程。
import multiprocessing
import time
class MyProcess(multiprocessing.Process):
def run(self):
for i in range(5):
print('{} - This is a child process.'.format(i))
time.sleep(1)
if __name__ == '__main__':
p = MyProcess()
p.start()
p.join(3)
if p.is_alive():
p.terminate()
print('The child process has been terminated.')
代码说明:
- 自定义一个名为
MyProcess
的进程类,继承自Process
类。在其run()
方法中定义子进程要执行的任务。 - 创建一个名为
p
的MyProcess
对象。 - 启动子进程。
- 让主进程等待子进程执行3秒钟后,检查子进程是否仍在运行。如果子进程仍在运行,说明已经超时,主进程将强制终止子进程,并打印出终止信息。
3.2 进程的属性和操作
name
:进程的名称。pid
:进程的ID。is_alive()
:判断进程是否正在运行。daemon
:进程的守护进程状态,可读写。authkey
:进程的身份验证键,可读写。exitcode
:进程的退出状态码,可读写。
import multiprocessing
import time
def func():
print('This is a child process.')
time.sleep(2)
if __name__ == '__main__':
p = multiprocessing.Process(target=func, name='myprocess')
p.daemon = True
p.authkey = b'123'
p.start()
time.sleep(1)
print('name:', p.name)
print('pid:', p.pid)
print('is_alive:', p.is_alive())
print('exitcode:', p.exitcode)
代码说明:
- 定义一个名为
func
的函数作为子进程要执行的任务。 - 创建一个名为
p
的Process
对象,指定子进程要执行的任务为func
,同时设置进程的名称、守护进程状态和身份验证键。 - 启动子进程。
- 让主进程等待1秒钟,等待子进程运行。
- 分别输出子进程的名称、ID、运行状态和退出状态码。
4. 示例说明
4.1 进程池
在并发编程中,进程池的概念比较常见,可以通过进程池来更好地管理进程。
import multiprocessing
import time
def func(num):
print('Process {} is running.'.format(num))
time.sleep(2)
print('Process {} is done.'.format(num))
return num
if __name__ == '__main__':
pool = multiprocessing.Pool(processes=3)
result = []
for i in range(5):
result.append(pool.apply_async(func, (i,)))
pool.close()
pool.join()
for res in result:
print('Result:', res.get())
代码说明:
- 定义一个名为
func
的函数作为进程池中子进程要执行的任务。 - 创建一个进程池,设置进程池中最多同时执行3个子进程。
- 创建一个空列表
result
,用于存放每个子进程执行完毕后的结果。 - 循环5次,将每个子进程加入进程池中,执行
func
函数,参数为当前循环次数i
。 - 关闭进程池。
- 等待所有子进程执行完毕。
- 循环输出每个子进程的执行结果。
4.2 多进程抓取网页
import multiprocessing
import requests
def fetch(url):
response = requests.get(url)
return response.content
if __name__ == '__main__':
urls = ['https://www.baidu.com', 'https://www.taobao.com', 'https://www.tencent.com']
pool = multiprocessing.Pool(processes=3)
result = []
for url in urls:
result.append(pool.apply_async(fetch, (url,)))
pool.close()
pool.join()
for res in result:
print('Length:', len(res.get()))
代码说明:
- 定义一个名为
fetch
的函数用于抓取网页,参数为网页地址。 - 在主函数中定义要抓取的网页地址列表
urls
。 - 创建一个进程池,设置进程池中最多同时执行3个子进程。
- 创建一个空列表
result
,用于存放每个子进程抓取网页的结果。 - 循环遍历每个网页地址,将每个子进程加入进程池中,执行
fetch
函数,参数为当前遍历到的网页地址。 - 关闭进程池。
- 等待所有子进程执行完毕。
- 循环输出每个子进程抓取网页的结果的长度。
本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:Python语法学习之进程的创建与常用方法详解 - Python技术站