【发布时间】:2014-05-25 17:13:31
【问题描述】:
我编写了一个从学校网站提取数据的脚本,但我在执行时间方面遇到了一些问题。
有 20 多个校区,每个校区都有三个学期的数据。该脚本查找这些学校名称,然后是每所学校可用的学期,然后是每学期提供课程的学科/部门。然后脚本搜索每个部门的课程,然后我用这些数据做事。
我只在一个校园内对脚本的执行进行了计时,它运行了三分钟多。当我为所有 24 个校区运行它时,它花了一个多小时。我正在使用“请求”库,它同步运行每个 HTTP 请求。我正在使用“请求”库,主要是因为它可以很好地处理会话。
我正在寻找减少脚本运行时间的方法,方法是让每个学期的各种请求并行运行。我怀疑如果我异步运行三个学期,那么每所学校应该花一分钟,而不是三分钟。然后,我可以并行运行所有学校,并为所有数据实现相同的分钟数。一分钟远小于一个小时零一刻钟!
我猜我错了吗,多线程/处理会如此大幅度地缩短执行时间?我应该为线程或进程使用哪些 Python 库?
一旦我在一个线程上处理了每所学校,如何将所有学校的数据整合到一个地方?我知道线程改变全局状态被认为是不好的做法,但是这里有什么替代方法?
【问题讨论】:
-
不太了解 Python,但您所描述的正是最初发明线程的原因:即使在单处理器机器上,线程也是一种组织程序的方式,必须等待同时进行两件或多件事情(例如,在不同的套接字上等待两个或更多的 HTTP 回复)。
-
注意,Python 线程不能使用多核。您可能仍然会看到它们的性能提升,但如果您的目标是同时运行多个事物,请查看可以利用多个内核的多处理。或者,其他 Python 实现,例如 Jython,可以在多个内核上运行多个线程。
标签: python multithreading performance multiprocessing