Python asyncio能帮我吗?

Python asyncio能帮我吗?,python,wxpython,python-asyncio,Python,Wxpython,Python Asyncio,我有一个使用wxpython4.0.3开发的小python应用程序,它执行相当简单的ETL类型任务: 接受用户输入以选择包含多个 包含CSV文件和时间序列数据的子目录。 转换每个文件中的数据以符合格式要求 由第三方收件人要求,并将其写出给新收件人 文件夹。 将每个新文件压缩到以原始文件命名的文件中 文件的父目录 在用户的倡议下,应用程序然后将zip文件FTPs到 要加载到数据存储中的第三方。 该应用程序运行得很好,但处理数千个CSV文件所需的时间非常长,而且据我所知,大部分都是IO限制的 asy

我有一个使用wxpython4.0.3开发的小python应用程序,它执行相当简单的ETL类型任务:

接受用户输入以选择包含多个 包含CSV文件和时间序列数据的子目录。 转换每个文件中的数据以符合格式要求 由第三方收件人要求,并将其写出给新收件人 文件夹。 将每个新文件压缩到以原始文件命名的文件中 文件的父目录 在用户的倡议下,应用程序然后将zip文件FTPs到 要加载到数据存储中的第三方。 该应用程序运行得很好,但处理数千个CSV文件所需的时间非常长,而且据我所知,大部分都是IO限制的

asyncio是一个合理的选择,还是任何人都可以提出其他建议?我最初是作为CLI编写的,使用pypy可以显著提高性能,但在为其他人开发UI时,我不愿意将pypy与wxpython结合起来


感谢您的指导。

是的,您可能会从使用异步库中受益。由于大部分时间都花在等待IO上,一个编写良好的异步程序将利用这段时间做其他事情,而不会产生额外线程/进程的开销。它的伸缩性非常好。

如果您看到使用PyPy而不是CPython可以显著提高速度,这意味着您的代码可能不受I/O限制。这意味着使I/O异步化不会有多大帮助。另外,这也是额外的工作,因为您必须将所有CPU繁重的任务重组为小块,可以重复等待,这样它们就不会阻塞其他任务

因此,您可能希望在这里使用多个进程

最简单的解决方案是使用a:只需将任务扔给执行器,它就会在子进程上运行它们,并为您返回未来

与使用asyncio不同,您根本不需要更改这些任务。他们只需在csv模块上循环即可读取文件,在一个大数据块中处理所有文件,甚至可以使用同步ftplib模块,而无需担心任何人会阻止其他人。只有顶级代码需要更改

但是,您可能需要考虑将代码拆分为在CPython运行的WX GUI,以及通过PyPy中的子进程运行的多处理引擎,然后在PyPy中旋转进程PraceSoSQL Existor。这将需要更多的工作,但这意味着您将获得使用PyPy的CPU优势、使用CPython的经过wx测试的优势以及多处理的并行性

另一个考虑的选项是在一个像麻木或熊猫这样的图书馆里,它可以做慢的部分,无论是阅读和处理CSV,还是在数千行上进行某种元素计算,或者更快速地,甚至可以释放吉尔,这意味着你不需要多重处理。 如果您的代码实际上是I/O绑定的代码,并且主要绑定在FTP请求上,那么asyncio会有所帮助。但这需要重写大量代码。您需要查找或编写一个异步IO驱动的FTP客户端库。而且,如果文件读取占用了您的大部分时间,那么将其转换为异步将是更多的工作

还存在将wx事件循环与asyncio事件循环集成的问题。您可能可以在第二个线程中运行asyncio循环,但随后需要想出一些在主线程中的wx事件循环和后台线程中的asyncio循环之间进行通信的方法。或者,您可能能够从一个循环驱动另一个循环,或者甚至可能有第三方库为您这样做。但是这可能更容易使用,或者有更好的第三方库来帮助使用twisted而不是asyncio之类的东西


但是,除非您需要大量的并发性,而您可能不需要,除非您有数百个不同的FTP服务器可以与之通信,否则线程也应该工作得很好,对代码的更改要少得多。只需使用一个,这与上面解释的使用ProcessPoolExecutor几乎相同。

为什么您认为它主要是I/O绑定的?PyPy显著加快了它的速度,这意味着可能有很多CPU限制的工作需要加快。但是为什么要使用ThreadPoolExecutor呢?若瓶颈是数据处理,那个么由于GIL的原因,它将不会有帮助。ProcessPoolExecutor?MikhailGerasimov OP说代码是I/O绑定的。如果他是对的,那么GIL就不是问题,线程也可以正常工作。如果他错了……好吧,这就是我整个前半部分答案的内容。@MikhailGerasimov啊,刚刚意识到我的链接和文本是反向的。这让你困惑吗?即使没有,我相信它也会让其他读者感到困惑,所以我修正了它,谢谢你让我看到它。