python - 在 python 线程池中的线程之间共享变量
问题描述
我有这样的代码:
from multiprocessing import Pool
def do_stuff(idx):
for i in items[idx:idx+20]:
# do stuff with idx
items = # a huge nested list
pool = Pool(5)
pool.map(do_stuff, range(0, len(items), 20))
pool.close()
pool.join()
问题是线程池不共享items
,而是为每个线程创建副本,这是一个问题,因为列表很大并且占用内存。items
有没有办法以共享的方式实现这一点?global
在基本库中找到了一些与该工作相关的示例,thread
但这似乎不适用于multiprocessing
lib。
谢谢!
解决方案
thread
并且multiprocessing
根本不能互换。
thread
仍然在幕后使用全局解释器锁,因此在线程之间共享变量要容易得多,而多处理不使用 GIL,因此更容易发生冲突。
一个更好的方法是返回结果,do_stuff
然后将结果一起编译。
在此处查看文档:https ://docs.python.org/2/library/multiprocessing.html#using-a-pool-of-workers
在您的情况下,您应该像这样使用它:
from multiprocessing import Pool
def do_stuff(idx):
for i in items[idx:idx+20]:
# do stuff with idx
items = # a huge nested list
pool = Pool(5)
multiple_results = [pool.apply_async(do_stuff, i) for i in range(0, len(items), 20)]
multiple_results = [res.get(timeout=1) for res in multiple_results]
根据评论编辑:
from multiprocessing import Pool
def do_stuff(items):
for i in items:
# do stuff with idx
items = # a huge nested list
pool = Pool(5)
pool.map(do_stuff, [x for x in items[::20]]) #generating a list of lists of twenty items for each thread to work on
pool.close()
pool.join()
推荐阅读
- c++ - 如何在 C++ 中存储动态创建的对象的地址?
- python - 从图像标签创建边界框
- git - 如何在 github 上恢复提交历史记录?
- three.js - 如何修复用于宽 FOV 显示的 Threejs webxr 示例?
- excel - Excel VBA - 调整 ChartArea 大小以适应范围
- c++ - 将变量传递给c ++(Arduino)中的函数
- c# - 基于组角色的授权
- javascript - Discord 机器人出现错误并且没有做它应该做的事情
- python - Python中嵌套列表的排列
- android - 在 RecyclerView 中,scrollToPosition 和 smoothScrollToPosition 有什么区别?