通过多处理有更好的方法吗?

Is there a better way via multiprocessing?

  1. 我正在使用 python 多处理来处理文件。最后处理 文件记录存储在字典 A 中,即 dict_A = {'file1_xx': '8-04-22', 'file2_xx': '8-04-22', 'file3_xx': '8-04-22', 'file4_xx': '8-04-22'}
  2. 扫描文件目录,最后修改日期的文件名存储在dict_test中。比较两个字典中记录的文件是否有新文件:即比较每个文件的最后修改日期,即 file1_xxdict_A 中的最后处理日期。如果文件的最后修改日期大于每个文件的最后处理日期,则有一个条件会更新 dict_A
  3. 我遇到了一些问题,因为在处理文件后字典没有更新。
  4. 理想情况下,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()

进程不共享变量。

在函数中,我会使用 returnfilenamedate 发送回主进程

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()