Python 多进程默认不能共享全局变量 主进程与子进程是并发执行的,进程之间默认是不能共享全局变量的(子进程不能改变主进程中全局变量的值)。 如果要共享全局变量需要用(multiprocessing.Value(“d”,10.0),数值)(multiprocessing.Array(“i”,[1,2,3,4,5]),数组)(multiprocessing.Manager().dict(),字典)(multiprocessing.Manager().list(range(5)))。 进程通信(进程之间传递数据)用进程队列(multiprocessing.Queue(),单向通信),管道( mu 在Python编程中,多进程(multiprocessing)是一种并行处理的方式,它允许程序同时执行多个独立的任务。然而,由于进程间内存是隔离的,多进程默认情况下无法共享全局变量。这意味着在主进程和子进程中,对同一全局变量的修改不会相互影响。下面将详细介绍如何在Python多进程中实现全局变量的共享以及进程间的通信。 1. **全局变量的不共享**: 在Python的多进程环境中,如以下代码所示,`datalist` 是一个全局变量,但在主进程和子进程中,它们各自拥有独立的副本,无法直接互相修改对方的`datalist`。 ```python global datalist datalist=['+++'] def adddata(): global datalist datalist.append(1) # ... ``` 主进程和子进程并发执行,各自对`datalist`进行操作,但不会影响对方的`datalist`。 2. **共享全局变量**: 要实现全局变量的共享,可以使用以下方法: - `multiprocessing.Value`: 创建一个共享的数值类型变量。 - `multiprocessing.Array`: 创建一个共享的数组。 - 使用`multiprocessing.Manager().dict()`或`multiprocessing.Manager().list()`: 创建共享的字典和列表。 例如,使用`multiprocessing.Value`共享数值变量: ```python num = multiprocessing.Value('d', 10.0) def func(num): num.value = 10.78 ``` 子进程通过修改`num.value`,主进程也能看到这个改变。 使用`multiprocessing.Array`共享整数数组: ```python num = multiprocessing.Array('i', [1, 2, 3, 4, 5]) def func(num): num[2] = 9999 ``` 子进程更改数组元素,主进程也会同步更新。 使用`multiprocessing.Manager`创建共享字典和列表: ```python with multiprocessing.Manager() as mg: mydict = mg.dict() mylist = mg.list(range(5)) ``` 子进程可以通过修改`mydict`和`mylist`来实现与主进程的共享。 3. **进程间通信**: - **进程队列(multiprocessing.Queue)**: 单向通信,用于进程间的数据传递。主进程可以向队列中放入数据,子进程可以从队列中取出数据。 - **管道(multiprocessing.Pipe)**: 双向通信,允许两个进程之间双向传递数据。 例如,使用进程队列进行通信: ```python from multiprocessing import Process, Queue def worker(q): q.put('Data from Worker') if __name__ == "__main__": q = Queue() p = Process(target=worker, args=(q,)) p.start() data = q.get() print(data) p.join() ``` 上述代码中,主进程创建一个队列`q`,子进程通过`q.put()`发送数据,主进程通过`q.get()`接收数据。 4. **线程中的全局变量**: 虽然本问题主要关注多进程,但值得一提的是,在多线程(threading)环境中,可以使用`global`关键字声明全局变量,线程间可以直接访问。不过,由于GIL(全局解释器锁)的存在,多线程环境下全局变量的修改仍然不是并发安全的。 Python多进程中,全局变量默认不可共享,但可以通过特定的共享对象(如`Value`、`Array`、`Manager`)和进程间通信机制(如队列、管道)来实现数据共享和通信。在设计多进程程序时,应谨慎处理全局变量,确保正确同步和通信,以避免数据竞争和死锁等问题。
![](https://csdnimg.cn/release/download_crawler_static/13739855/bg1.jpg)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![avatar](https://profile-avatar.csdnimg.cn/default.jpg!1)
- 粉丝: 0
- 资源: 939
我的内容管理 展开
我的资源 快来上传第一个资源
我的收益
登录查看自己的收益我的积分 登录查看自己的积分
我的C币 登录后查看C币余额
我的收藏
我的下载
下载帮助
![voice](https://csdnimg.cn/release/downloadcmsfe/public/img/voice.245cc511.png)
![center-task](https://csdnimg.cn/release/downloadcmsfe/public/img/center-task.c2eda91a.png)
最新资源
![feedback](https://img-home.csdnimg.cn/images/20220527035711.png)
![feedback-tip](https://img-home.csdnimg.cn/images/20220527035111.png)
![dialog-icon](https://csdnimg.cn/release/downloadcmsfe/public/img/green-success.6a4acb44.png)
评论0