我正在通过oracle表在内存中创建共享列表:
dsn_tns = cx_Oracle.makedsn('myserver.net', '1521', service_name='PARIELGX');
con = cx_Oracle.connect(user='fred',password='password',dsn=dsn_tns);
stats_results = [["OWNER","TABLE","COLUMN_NAME","RECORD_COUNT","DISTINCT_VALUES","MIN_LENGTH","MAX_LENGTH","MIN_VAL","MAX_VAL"]];
sql = "SELECT * FROM ARIEL.MY_TABLE"
cur = con.cursor();
cur.execute(sql);
rs = cur.fetchall();
lrs = manager.list(list(rs)) # shared memory list
print("Type of lrs is :" + str(type(lrs)))
print("Address of lrs is: " + hex(id(lrs)))
关键行在这里:
lrs = manager.list(list(rs)) # shared memory list
print("Type of lrs is :" + str(type(lrs)))
print("Address of lrs is: " + hex(id(lrs)))
打印出列表的地址:
Address of lrs is: 0x7f3c71292ed0
我期望将列表作为被调用进程的参数传递时不会被复制。但是,当我在map_async调用的进程中检查参数的内存时,情况有所不同。我或者错误地使用了Manager.list(),并且整个列表都被序列化到进程中,或者以某种方式发送了代理对象。但是我的并行作业的性能意味着我不应该像这样在map_async中将列表作为参数传递:
pool_results = pool.map_async(gs.get_column_stats_rs, [(lrs, col_name, col_names) for col_name in col_names]).get()
get_column_stats函数中lrs的内存地址如下:
SUBPROCESS Address of rs is: 0x7f3c73283690
那么,如果不通过将其作为参数传递,那么如何使map_async调用的子进程能够访问管理器共享列表进行处理?
请注意,已确认列表的类型为:“ multiprocessing.managers.ListProxy”。
我假设使用Manager.list(),其中列表是一个元组列表就可以了。