作者:sendymylove睛飘益 | 来源:互联网 | 2024-11-25 16:40
本文介绍了进程的基本概念及其在操作系统中的重要性,探讨了进程与程序的区别,以及如何通过多进程实现并发和并行。文章还详细讲解了Python中的multiprocessing模块,包括Process类的使用方法、进程间的同步与异步调用、阻塞与非阻塞操作,并通过实例演示了进程池的应用。
一、进程概述
进程是操作系统进行资源分配和调度的基本单位,它是程序执行的一个实例。即使在单CPU环境下,操作系统也能通过时间片轮转等机制实现多任务的并发执行。进程的存在使得现代计算机能够高效地管理和执行多个任务。
二、进程与程序的关系
程序是静态的指令集合,而进程是程序的一次动态执行过程。同一程序多次运行会产生多个独立的进程,每个进程拥有自己独立的内存空间和系统资源。
三、并发与并行
并发是指多个任务在同一时间段内交错执行,而并行是指多个任务同时执行。在单核CPU上,通过多道技术实现并发;在多核CPU上,可以通过每个核心执行不同的任务来实现并行。两者在用户体验上都是“同时”运行的。
四、同步与异步
同步调用是指调用者在没有得到结果前不会返回,而异步调用则会在调用后立即返回,结果通过回调或其他方式通知调用者。阻塞调用会使调用者在等待结果期间暂停执行,而非阻塞调用则不会。
五、Python中的多进程实现
1. multiprocessing模块
Python的multiprocessing模块提供了丰富的API来创建和管理进程。该模块支持子进程的创建、进程间的通信和同步等操作。与线程不同,进程之间没有共享状态,每个进程都有自己独立的内存空间。
2. Process类
Process类用于创建子进程。主要方法包括:start()
启动进程,join()
主进程等待子进程结束,terminate()
强制终止进程等。主要属性包括:pid
进程ID,name
进程名称等。
3. 创建并启动子进程
from multiprocessing import Process
import time
def task(name):
print(f'{name} is running')
time.sleep(2)
if __name__ == '__main__':
p = Process(target=task, args=('egon',))
p.start()
print('主')
4. 通过继承Process类创建子进程
from multiprocessing import Process
import time
class MyProcess(Process):
def __init__(self, name):
super().__init__()
self.name = name
def run(self):
print(f'{self.name} is running')
time.sleep(2)
if __name__ == '__main__':
p = MyProcess('egon')
p.start()
print('主')
5. 进程间的通信与同步
进程间通信可以通过Queue、Pipe等机制实现。同步可以通过Lock、Event等机制实现。
6. 进程池(Pool)
进程池可以预先创建一组进程,当有任务提交时,从池中取出一个空闲进程来执行任务。进程池适用于任务量大但核心数有限的场景。
from concurrent.futures import ProcessPoolExecutor
import time, os
def run(name, n):
print(f'{name} is running {os.getpid()}')
time.sleep(1)
return n ** 2
if __name__ == '__main__':
with ProcessPoolExecutor(4) as p:
results = [p.submit(run, f'alex {i}', i) for i in range(10)]
for future in results:
print(future.result())
print('主', os.getpid())
六、Socket并发编程示例
通过多进程可以实现Socket服务端与多个客户端的并发通信。
服务端
from socket import *
from multiprocessing import Process
server = socket(AF_INET, SOCK_STREAM)
server.setsockopt(SOL_SOCKET, SO_REUSEADDR, 1)
server.bind(('127.0.0.1', 8080))
server.listen(5)
def talk(conn):
while True:
try:
msg = conn.recv(1024)
if not msg:
break
conn.send(msg.upper())
except Exception:
break
if __name__ == '__main__':
while True:
conn, client_addr = server.accept()
p = Process(target=talk, args=(conn,))
p.start()
客户端
from socket import *
client = socket(AF_INET, SOCK_STREAM)
client.connect(('127.0.0.1', 8080))
while True:
msg = input('>>: ').strip()
if not msg:
continue
client.send(msg.encode('utf-8'))
msg = client.recv(1024)
print(msg.decode('utf-8'))
七、总结
本文详细介绍了进程的概念、多进程的实现方式以及Python中多进程的相关技术。通过这些技术,可以有效地管理和调度多个任务,提高程序的并发性能。