python 进程管理

 # 1. 顺序执行任务

for i in range(1000):
    run_proc(i)
耗时: 0:00:00.020522

# 2.1 多进程异步并行执行,进程间没有先后顺序

for i in range(1000):
    p = Process(target=run_proc, args=(i,))
    p.start()
耗时: 0:00:01.877499
# 2.2 多进程同步并行执行,进程间有先后顺序
for i in range(1000):
    p = Process(target=run_proc, args=(i,))
    p.start()
p.join()
耗时: 0:00:01.771093
# 3.1 使用Pool管理多个进程,同步执行
pool = Pool()
start = datetime.now()
for i in range(1000):
    pool.apply(func=run_proc, args=(i,))
pool.close()
pool.join()
耗时: 0:00:00.206646

# 3.2 使用Pool管理多个进程,异步执行

for i in range(1000):
    pool.apply_async(func=run_proc, args=(i,))
pool.close()
pool.join()
耗时: 0:00:00.104507


改为Run 10000次,用pool就快很多了。因为不用pool这些进程回互相抢,反而慢?

 # 1. 顺序执行任务

耗时: 0:00:00.211465
# 2.1 多进程异步并行执行,进程间没有先后顺序
耗时: 0:00:19.826320
# 2.2 多进程同步并行执行,进程间有先后顺序
耗时: 0:00:21.978858
# 3.1 使用Pool管理多个进程,同步执行
耗时: 0:00:02.041180
# 3.2 使用Pool管理多个进程,异步执行
耗时: 0:00:00.947051

Pool vs. 同步、异步 需要再Study!



### Python 进程管理教程及最佳实践 #### 1. 使用 `multiprocessing` 模块创建和管理进程 Python 的 `multiprocessing` 模块提供了用于启动新进程的方法,这些方法类似于线程模块中的接口。然而,与线程不同的是,子进程中运行的函数将在独立的操作系统进程中执行。 ```python from multiprocessing import Process, current_process def worker(num): """简单的工作者函数""" print(f'Worker: {num}, PID: {current_process().pid}') if __name__ == '__main__': processes = [] for i in range(5): # 创建多个进程 p = Process(target=worker, args=(i,)) processes.append(p) p.start() for p in processes: p.join() # 等待所有子进程结束 ``` 这段代码展示了如何利用 `Process` 类来创建新的工作进程,并传递参数给它们[^1]。 #### 2. 实现进程间的同步机制 当涉及到共享资源时,确保各进程能够安全访问至关重要。为此,可以采用锁(Lock)、事件(Event)等同步原语来进行控制。 ```python from multiprocessing import Lock, Value lock = Lock() counter = Value('i', 0) def update_counter(): global counter with lock: counter.value += 1 print(f'Counter updated to {counter.value}') ``` 这里定义了一个全局计数器变量以及一个锁定对象,以防止竞争条件的发生。 #### 3. 利用队列进行跨进程通信 为了使不同的进程之间交换数据,推荐使用 `multiprocessing.Queue` 或者更高效的替代品如 `JoinableQueue` 来实现消息传递功能。 ```python from multiprocessing import Queue q = Queue() def producer(q): q.put([42, None, 'hello']) def consumer(q): data = q.get() print(data) p_producer = Process(target=producer, args=(q,)) p_consumer = Process(target=consumer, args=(q,)) p_producer.start(); p_consumer.start() p_producer.join(); p_consumer.join() ``` 此示例说明了生产者-消费者模式下两个进程间的数据传输过程[^2]。 #### 4. 日志记录优化建议 对于大型分布式应用来说,良好的日志策略不可或缺。考虑到多进程环境下的特殊需求,应该采取集中式的日志收集方案或是基于文件系统的轮转日志配置等方式提高效率并便于后续分析。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值