利用多处理并不复杂
Python中的基础多处理类是非常有用的。如果你曾经需要作业运行得更快,也许你已经尝试过矢量化,你已经测试过多种方法来提高速度,但还是等待得太久,那么继续阅读。多处理你的工作负载有很多优点。但要注意的是,多处理并不总是更快--你需要正确的用例来提高速度。不要着急,我有一个简单的解决方案,使利用多处理更容易。
Python中的基本多处理模块很好,但我发现扩展的多处理包(在多处理功能的基础上进行了改进)更简单,更不容易出错。下面是如何将其安装到你的环境中的(你也会看到tqdm,这是我们用来跟踪作业间进度的包)。
pip install tqdm multiprocess
因为我不喜欢让你等很久才看到代码,这里是我们要讨论的代码。
def lite_multi_process(any_function, all_events: list, n_jobs=1):
lite_multi_process的介绍
在我看来,这个函数胜过所有其他多进程函数。它接收任何函数,所有的事件(作为一个可以迭代的对象,像一个列表),以及你想并发运行的作业数量。
比方说,你需要从你的PC或笔记本电脑上查询AWS S3的一组特定数据。你的函数利用awswrangler或boto3,最终,你的函数查询数据,通过一系列操作进行处理,并将结果保存到另一个AWS S3位置(btw:这可能是使用AWS SQS和AWS Lambda进程的正确时间)。为了举例说明,我们将继续。
关于事件列表,我建议你的列表中包含键值对的字典--类似于每个工作的唯一信息,所以。
{
你的函数可以是这样的(当然,要有查询、处理和保存的代码)。
def my_function(event):
使用lite_multi_process函数同时运行8个作业的方法是这样的。
results = lite_multi_process(my_function, my_events, n_jobs=8)
超级简单吧?
现在,让我们假设你的函数不是通过返回状态来完成的(因为你不会对状态的结果集做任何事情),而是返回Pandas数据帧,你需要把这些数据帧连接起来,然后保存到AWS S3。下面是这个过程的样子。
results = lite_multi_process(my_function, my_events, n_jobs=8)
同样,小菜一碟。你的结果包含一个迷你数据帧的列表。你所需要做的就是进行连接操作。
最后要提到的,也是我非常喜欢这个流程的另一个原因,这个函数可以很容易地进行调试。简单地设置n_job=1,调试,继续前进。通常情况下,对更复杂的多处理引擎进行调试是很麻烦的。
最后的话
我们讨论了多进程模块的情况,我们希望能同时处理工作。lite_multi_process函数摄取了所有必要的信息,并将返回一个结果列表。对这些结果做你想做的事,然后继续前进。
让我知道你在评论中的想法。我希望这能在你的工作流程中帮助你。
一个简单的Python多处理框架》最初发表在《走向数据科学》上,人们在Medium上通过强调和回应这个故事继续对话。