Python 控制派生进程返回的值

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

在下面的代码中,worker函数检查传递的数据是否有效,如果有效,则返回一个字典,该字典将用于批量SQLAlchemy核心插入。如果无效,我希望不要将
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(过程数据,数据到过程))