Python 控制派生进程返回的值
在下面的代码中,worker函数检查传递的数据是否有效,如果有效,则返回一个字典,该字典将用于批量SQLAlchemy核心插入。如果无效,我希望不要将Python 控制派生进程返回的值,python,sqlalchemy,multiprocessing,Python,Sqlalchemy,Multiprocessing,在下面的代码中,worker函数检查传递的数据是否有效,如果有效,则返回一个字典,该字典将用于批量SQLAlchemy核心插入。如果无效,我希望不要将None值添加到receiving_列表,因为如果无效,大容量插入将失败,因为单个None值无法映射到表结构 from datetime import datetime from sqlalchemy import Table import multiprocessing CONN = Engine.connect() #Engine is im
None
值添加到receiving_列表
,因为如果无效,大容量插入将失败,因为单个None
值无法映射到表结构
from datetime import datetime
from sqlalchemy import Table
import multiprocessing
CONN = Engine.connect() #Engine is imported from another module
NUM_CONSUMERS = multiprocessing.cpu_count()
p = multiprocessing.Pool(NUM_CONSUMERS)
def process_data(data):
#Long process to validate data
if is_valid_data(data) == True:
returned_dict = {}
returned_dict['created_at'] = datetime.now()
returned_dict['col1'] = data[0]
returned_dict['colN'] = data[N]
return returned_dict
else:
return None
def spawn_some_processes(data):
table_to_insert = Table('postgresql_database_table', meta, autoload=True, autoload_with=Engine)
While True:
#Get some data here and pass it on to the worker
receiving_list = p.map(process_data, data_to_process)
try:
if len(receiving_list) > 0:
trans = CONN.begin()
CONN.execute(table_to_insert.insert(), receiving_list)
trans.commit()
except IntegrityError:
trans.rollback()
except:
trans.rollback()
尝试重新表述以下问题:当派生进程返回值None
时,如何阻止派生进程添加到receiving_list
一种解决方法是将队列与
queue.put()
和queue.get()
合并,这将仅放置有效数据。这样做的缺点是,在进程结束后,我必须解包
队列,这会增加开销。我的理想解决方案是返回一个干净的字典列表,SQLAlchemy可以使用它进行批量插入您只需从列表中删除None
条目即可:
received_list = filter(None, p.map(process_data, data_to_process))
即使对于非常庞大的列表,这也非常快:
>>> timeit.timeit('l = filter(None, l)', 'l = range(0,10000000)', number=1)
0.47683095932006836
请注意,使用过滤器将删除bool(val)为False的任何内容,如空字符串、空列表等。不过,这对于您的用例来说应该没问题。它只需稍加修改即可工作。添加list
如下所示:received\u list=list(过滤器(无,p.map(过程数据,数据到过程))