多进程callback函数使用全局变量

from multiprocessing import Pool

pool = Pool(processes=10)

lstm_y = 0
combine_y = 1


def work_callback1(res):
    print('work1')
    global lstm_y
    global  combine_y
    lstm_y += res
    combine_y += res



def run1():
    return 1

if __name__ == '__main__':
    for i in range(1,10):
        res1 = pool.apply_async(run1, (i,),callback=work_callback1)

    print(lstm_y,combine_y)

the code above is not work! I will update it later!

<think>我们使用Python多进程模块`multiprocessing`来创建和管理进程。主要涉及`Process`类、`Pool`类以及进程间通信(如`Queue`、`Pipe`)等。 下面将分别介绍几种常用的多进程使用方法: 1. 使用`Process`类创建进程 2. 使用进程池`Pool` 3. 进程间通信(以`Queue`为例) 注意:在Windows系统中,由于没有fork,多进程的实现必须放在`if __name__ == '__main__':`下面,以避免递归创建进程。 一、使用`Process`类创建进程 步骤: a. 导入`multiprocessing`模块 b. 定义一个函数作为进程的执行体 c. 创建`Process`对象,指定target为定义的函数 d. 启动进程(使用start()方法) e. 等待进程结束(使用join()方法) 二、使用进程池`Pool` 当我们有大量任务需要多进程执行时,可以使用进程池。进程池可以管理固定数量的进程来执行任务。 常用方法: - Pool(processes): 创建进程池,processes指定进程数量 - apply_async(func, args, callback): 异步非阻塞方式添加任务 - close(): 关闭进程池,不再接受新任务 - join(): 等待进程池中的所有进程结束 三、进程间通信 由于进程间内存是独立的,因此需要特殊的机制来实现进程间通信。常用`Queue`(队列)来实现多进程之间的数据传递。 下面通过代码示例具体说明: 示例1:使用Process类 </think>在Python中,多进程通过`multiprocessing`模块实现,它允许充分利用多核CPU资源,避免GIL(全局解释器锁)限制。以下是详细使用方法及代码示例: ### 1. 基本进程创建 (`Process`类) ```python from multiprocessing import Process import os def worker(num): print(f"子进程 {num} PID: {os.getpid()}, 父进程 PID: {os.getppid()}") if __name__ == '__main__': # 必须的守护条件(Windows系统必需) processes = [] for i in range(3): p = Process(target=worker, args=(i,)) # 创建进程对象 processes.append(p) p.start() # 启动进程 for p in processes: p.join() # 等待进程结束 print("所有进程结束") ``` ### 2. 进程池 (`Pool`类) - 批量任务处理 ```python from multiprocessing import Pool import time def square(x): time.sleep(0.5) # 模拟耗时操作 return x * x if __name__ == '__main__': with Pool(processes=4) as pool: # 创建4个进程的池 # map阻塞式并行执行 results = pool.map(square, range(10)) print("map结果:", results) # apply_async非阻塞执行 async_results = [pool.apply_async(square, (i,)) for i in range(5)] print("异步结果:", [res.get(timeout=1) for res in async_results]) ``` ### 3. 进程间通信(IPC) #### (1) 队列 (`Queue`) ```python from multiprocessing import Process, Queue def producer(q): q.put("消息来自子进程") if __name__ == '__main__': q = Queue() # 创建进程安全队列 p = Process(target=producer, args=(q,)) p.start() print("收到:", q.get()) # 阻塞获数据 p.join() ``` #### (2) 管道 (`Pipe`) ```python from multiprocessing import Process, Pipe def child(conn): conn.send("你好父进程") # 发送消息 print("子进程收到:", conn.recv()) # 接收消息 conn.close() if __name__ == '__main__': parent_conn, child_conn = Pipe() # 创建双向管道 p = Process(target=child, args=(child_conn,)) p.start() print("父进程收到:", parent_conn.recv()) parent_conn.send("你好子进程") p.join() ``` ### 4. 共享内存 (`Value`, `Array`) ```python from multiprocessing import Process, Value, Array def modify(n, arr): n.value = 3.14 for i in range(len(arr)): arr[i] *= 2 if __name__ == '__main__': num = Value('d', 0.0) # 共享浮点数 (typecode='d') arr = Array('i', range(5)) # 共享数组 (typecode='i') p = Process(target=modify, args=(num, arr)) p.start() p.join() print("num:", num.value) # 输出: 3.14 print("arr:", list(arr)) # 输出: [0, 2, 4, 6, 8] ``` ### 关键注意事项: 1. **跨平台兼容性** 所有多进程代码必须放在 `if __name__ == '__main__':` 下,尤其在Windows系统中必不可少。 2. **进程间数据隔离** 子进程无法直接修改父进程变量,需通过IPC(队列/管道/共享内存)传递数据。 3. **资源消耗** 进程创建开销大于线程,适合CPU密集型任务(如图像处理、数学计算)。 4. **僵尸进程处理** 务必使用`join()`或设置`daemon`属性确保资源回收。 5. **共享状态同步** 共享内存需配合`multiprocessing.Lock`避免竞争条件。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值