Python多处理DictProxy附加到列表的dict不起作用
内容导读
互联网集市收集整理的这篇技术教程文章主要介绍了Python多处理DictProxy附加到列表的dict不起作用,小编现在分享给大家,供广大互联网技能从业者学习和参考。文章包含2290字,纯文字阅读大概需要4分钟。
内容图文
![Python多处理DictProxy附加到列表的dict不起作用](/upload/InfoBanner/zyjiaocheng/788/939ca4edee0846319980f7cf738934bd.jpg)
我正在编写一个使用multiprocessing.managers.DictProxy的程序.程序遍历一个目录,并创建一个dict,其中username是pwd.getpwuid(os.stat(file)[4])[0]获得的密钥,密钥对应的值将是包含文件的列表由该用户拥有.例如,假设的数据结构:
{'root': ["/boot/vmlinuz", "/boot/grub"], 'testuser': ["/home/testuser", "/home/testuser/.bashrc"]}
我写的代码就是这样做的
#!/usr/bin/python
import os
import multiprocessing
import sys
import pwd
import grp
manager_attributes = multiprocessing.Manager()
file_stats_user = manager_attributes.dict()
def filestat(file):
try:
stat = os.stat(file)
user = pwd.getpwuid(stat[4])[0]
group = grp.getgrgid(stat[5])[0]
if user not in file_stats_user:
file_stats_user[user] = []
file_stats_user[user].append(file)
except OSError, e:
print e
try:
cores = (multiprocessing.cpu_count()*2)
except:
cores = 8
print "Starting parallel execution with ", cores, "concurrency"
pool_get_attributes = multiprocessing.Pool(cores)
pool_get_attributes.map(filestat, files)
pool_get_attributes.close()
pool_get_attributes.join()
其中files是获得的所有文件的列表.
但是,当我打印file_stats_user这是一个multiprocessing.managers.DictProxy对象时,我得到了键,但列表值为空,如
{'root': [], 'testuser': []}
file_stats_user [user] .append(file)不会将文件名附加到相应的键.
我在这做错了什么?
谢谢.
解决方法:
如果两个进程在同一时间更新同一用户的dict,则编辑先前的解决方案具有竞争条件
您的解决方案不起作用,因为默认情况下,列表是当前进程的本地列表,并且对其进行的更新未被代理.
为了使其正常工作,您应该使用一个代理列表,以便在所有过程中进行更新
更换
file_stats_user[user] = []
通过
file_stats_user[user] = manager_attributes.list()
现在,当您附加到列表时,它在所有进程中都是相同的
但是使用共享对象是进行多进程的一种不好的方法
更好的方法是收集每个呼叫的结果
from collections import defaultdict
def filestat(file):
try:
stat = os.stat(file)
user = pwd.getpwuid(stat[4])[0]
group = grp.getgrgid(stat[5])[0]
return user, file
except OSError, e:
print e
return None
try:
cores = (multiprocessing.cpu_count()*2)
except:
cores = 8
print "Starting parallel execution with ", cores, "concurrency"
pool_get_attributes = multiprocessing.Pool(cores)
result_map = pool_get_attributes.map(filestat, files)
result = defaultdict(list)
for user,file in (r for r in result_map if r is not None):
result[user].append(file)
pool_get_attributes.close()
pool_get_attributes.join()
内容总结
以上是互联网集市为您收集整理的Python多处理DictProxy附加到列表的dict不起作用全部内容,希望文章能够帮你解决Python多处理DictProxy附加到列表的dict不起作用所遇到的程序开发问题。 如果觉得互联网集市技术教程内容还不错,欢迎将互联网集市网站推荐给程序员好友。
内容备注
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 gblab@vip.qq.com 举报,一经查实,本站将立刻删除。
内容手机端
扫描二维码推送至手机访问。