在python多处理模块

时间:2019-06-17 16:09:26

标签: python multiprocessing

我正在通过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(),其中列表是一个元组列表就可以了。

0 个答案:

没有答案