通过多处理有更好的方法吗?
Is there a better way via multiprocessing?
- 我正在使用 python 多处理来处理文件。最后处理
文件记录存储在字典 A 中,即
dict_A = {'file1_xx': '8-04-22', 'file2_xx': '8-04-22', 'file3_xx': '8-04-22', 'file4_xx': '8-04-22'}
- 扫描文件目录,最后修改日期的文件名存储在
dict_test
中。比较两个字典中记录的文件是否有新文件:即比较每个文件的最后修改日期,即 file1_xx
与 dict_A
中的最后处理日期。如果文件的最后修改日期大于每个文件的最后处理日期,则有一个条件会更新 dict_A
。
- 我遇到了一些问题,因为在处理文件后字典没有更新。
- 理想情况下,
dict_A
应使用同一类别的每个文件的最新修改日期进行更新。这个 dict_A
然后通过 sqlalchemy 上传到 PostgreSQL 数据库。
def compare_rec(i):
a = dict_A[i]
b = dict_test[i]
if a >= b:
print("none")
else:
lock.acquire()
print("found")
a = b
lock.release()
def init(l):
global lock
lock = l
if __name__ == '__main__':
file_cat=['a', 'b', 'c', 'd']
dict_A={'a': '10', 'b': '10', 'c': '10', 'd': '10'}
dict_test={'a': '11', 'b': '11', 'c': '11', 'd': '11'}
l = multiprocessing.Lock()
pool = multiprocessing.Pool(initializer=init, initargs=(l,))
pool.map(compare_rec, file_cat)
pool.close()
pool.join()
进程不共享变量。
在函数中,我会使用 return
将 filename
和 date
发送回主进程
if ...:
return i, a
else:
return i, b
主线程应该从所有进程中获取结果
results = pool.map(compare_rec, file_cat)
它应该更新字典
dict_A.update(results)
完整代码:
import multiprocessing
def compare_rec(key):
print('key:', key)
a = dict_A[key]
b = dict_test[key]
if a >= b:
print("none", key, a)
return key, a
else:
print("found:", key, b)
return key, b
if __name__ == '__main__':
file_cat = ['a', 'b', 'c', 'd']
dict_A = {'a': '10', 'b': '10', 'c': '10', 'd': '10'}
dict_test = {'a': '11', 'b': '11', 'c': '11', 'd': '11'}
pool = multiprocessing.Pool()
results = pool.map(compare_rec, file_cat)
print(results)
print('before:', dict_A)
dict_A.update(results)
print('after :', dict_A)
pool.close()
pool.join()
- 我正在使用 python 多处理来处理文件。最后处理
文件记录存储在字典 A 中,即
dict_A = {'file1_xx': '8-04-22', 'file2_xx': '8-04-22', 'file3_xx': '8-04-22', 'file4_xx': '8-04-22'}
- 扫描文件目录,最后修改日期的文件名存储在
dict_test
中。比较两个字典中记录的文件是否有新文件:即比较每个文件的最后修改日期,即file1_xx
与dict_A
中的最后处理日期。如果文件的最后修改日期大于每个文件的最后处理日期,则有一个条件会更新dict_A
。 - 我遇到了一些问题,因为在处理文件后字典没有更新。
- 理想情况下,
dict_A
应使用同一类别的每个文件的最新修改日期进行更新。这个dict_A
然后通过 sqlalchemy 上传到 PostgreSQL 数据库。
def compare_rec(i):
a = dict_A[i]
b = dict_test[i]
if a >= b:
print("none")
else:
lock.acquire()
print("found")
a = b
lock.release()
def init(l):
global lock
lock = l
if __name__ == '__main__':
file_cat=['a', 'b', 'c', 'd']
dict_A={'a': '10', 'b': '10', 'c': '10', 'd': '10'}
dict_test={'a': '11', 'b': '11', 'c': '11', 'd': '11'}
l = multiprocessing.Lock()
pool = multiprocessing.Pool(initializer=init, initargs=(l,))
pool.map(compare_rec, file_cat)
pool.close()
pool.join()
进程不共享变量。
在函数中,我会使用 return
将 filename
和 date
发送回主进程
if ...:
return i, a
else:
return i, b
主线程应该从所有进程中获取结果
results = pool.map(compare_rec, file_cat)
它应该更新字典
dict_A.update(results)
完整代码:
import multiprocessing
def compare_rec(key):
print('key:', key)
a = dict_A[key]
b = dict_test[key]
if a >= b:
print("none", key, a)
return key, a
else:
print("found:", key, b)
return key, b
if __name__ == '__main__':
file_cat = ['a', 'b', 'c', 'd']
dict_A = {'a': '10', 'b': '10', 'c': '10', 'd': '10'}
dict_test = {'a': '11', 'b': '11', 'c': '11', 'd': '11'}
pool = multiprocessing.Pool()
results = pool.map(compare_rec, file_cat)
print(results)
print('before:', dict_A)
dict_A.update(results)
print('after :', dict_A)
pool.close()
pool.join()