pool.apply_async内使用不了globals()
时间: 2024-03-31 12:32:16 浏览: 65
是的,您在使用`pool.apply_async`时无法访问到`globals()`,因为该方法是在新的进程中执行的,而每个进程都有自己的`globals()`,与原始进程中的`globals()`不同。如果您需要在新的进程中访问某些全局变量,您可以使用`multiprocessing.Manager()`来创建共享变量,或者使用`multiprocessing.Queue()`来在进程之间传递数据。
相关问题
pool.apply_async内创建globals()
在`pool.apply_async`内创建`globals()`是不可行的,因为每个进程都有自己的`globals()`,而且在新的进程中创建的`globals()`只能在该进程中访问,无法在其他进程中共享。如果您需要在多个进程之间共享变量,您可以使用`multiprocessing.Manager()`创建共享变量,例如:
```python
import multiprocessing
def worker(shared_dict):
# 在进程中更新共享变量
shared_dict["key"] = "value"
if __name__ == "__main__":
manager = multiprocessing.Manager()
shared_dict = manager.dict()
# 创建进程池
pool = multiprocessing.Pool(processes=4)
# 在进程池中执行任务
pool.apply_async(worker, args=(shared_dict,))
# 关闭进程池
pool.close()
pool.join()
# 打印共享变量
print(shared_dict)
```
在这个例子中,我们使用`multiprocessing.Manager()`创建了一个共享变量`shared_dict`,并将其传递给`worker()`函数。在`worker()`函数中,我们更新了`shared_dict`中的值。由于`shared_dict`是一个共享变量,因此在其他进程中也可以访问它。在主进程中,我们打印了`shared_dict`的值,可以看到它已经被更新了。
在一个pool.apply_async内创建globals()不需要共享
即使在`pool.apply_async`内创建`globals()`,也无法实现在多个进程之间共享变量。这是因为`pool.apply_async`会在新的进程中执行函数,新的进程会拥有自己的`globals()`,与原始进程中的`globals()`不同。因此,如果您需要在多个进程之间共享变量,仍然需要使用`multiprocessing.Manager()`或`multiprocessing.Queue()`等方式来创建共享变量。如果您只是需要在`pool.apply_async`内部使用全局变量,可以直接在函数内定义全局变量,例如:
```python
import multiprocessing
def worker():
# 在函数内部定义全局变量
global my_global_var
my_global_var = "Hello world!"
if __name__ == "__main__":
# 创建进程池
pool = multiprocessing.Pool(processes=4)
# 在进程池中执行任务
pool.apply_async(worker)
# 关闭进程池
pool.close()
pool.join()
# 打印全局变量
print(my_global_var)
```
在这个例子中,我们在`worker()`函数内部定义了一个全局变量`my_global_var`。由于`my_global_var`是一个全局变量,因此在`worker()`函数中可以直接访问和修改它。在主进程中,我们打印了`my_global_var`的值,可以看到它已经被更新了。请注意,虽然我们在函数内部定义了全局变量,但它仍然只能在该进程中访问,不能在其他进程中共享。
阅读全文