Я пишу программу, которая использует multiprocessing.managers.DictProxy. Программа перемещается по каталогу и создает dict с именем пользователя в качестве ключа, полученного с помощью pwd.getpwuid(os.stat(file)[4])[0]
, и соответствующее значение для ключа будет списком, который содержит файлы, принадлежащие этому пользователю. Например, для предполагаемой структуры данных:Python Multiprocessing DictProxy append to dict of list не работает
{'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()
где файлы находятся список всех файлов, полученные.
Однако, когда я печати file_stats_user который является объектом multiprocessing.managers.DictProxy, я получаю ключи, но список значений являются пустыми, а
{'root': [], 'testuser': []}
file_stats_user[user].append(file)
не прилагая имя файла к соответствующему ключу. Что я здесь делаю неправильно?
спасибо.
при использовании 'multiprocessing', вы должны защитить главный модуль с' если __name__ == '__main __' '. –
Эта программа не называется модулем, так что это все еще необходимо @NizamMohamed? – nohup