每个文件都有10000行的参数。我有5个自定义下载程序。每项工作可能需要5秒到2分钟。如果下载器当前不工作,如何创建遍历10000行的内容,并将每个作业分配给下载器?在
编辑:
对我来说困难的部分是每个Downloader
都是一个类的实例,而实例之间的区别是我实例化5Downloader
对象时指定的端口号。所以我有a = Downloader(port_number=7751) ... e = Downloader(port_number=7755)
。那么,如果我使用Downloader
我会使用a.run(row)
。在
我如何将工人定义为a, b, c, d, e
而不是downloader function
?在
有很多方法可以做到这一点-最简单的方法是使用
multiprocessing.Pool
并让它为您组织工作人员-10k行并不算多,假设一个平均的URL甚至是一个完整的千字节长,它仍然只需要10MB的内存,而且内存很便宜。在所以,只需读取内存中的文件并将其映射到
multiprocessing.Pool
以执行您的出价:如果需要共享内存,也可以使用
threading
而不是multiprocessing
(或multiprocessing.pool.ThreadPool
作为替换)在单个进程中执行所有操作。一个线程对于下载来说已经足够了,除非您正在进行额外的处理。在更新
如果您希望下载程序作为类实例运行,可以将
^{pr2}$downloader
函数转换为Downloader
实例的工厂,然后在url旁边传递实例化这些实例所需的内容。下面是一个简单的循环方法:请记住,这不是最平衡的解决方案,因为它可能碰巧有两个
Downloader
实例运行同一个端口,但它将平均处理足够大的数据。在{{7}如果你不想创建一个cd7端口的实例,你就不需要创建一个cd7端口的实例了。在
将10000行读入字符串列表。在
假设数据不包括端口号,而编辑的问题提到了5个端口,则应该将其添加到数据中。在
^{pr2}$编写一个函数,将其中一个元组作为参数,拆分它,创建一个下载器对象并运行它。在
使用} 方法,将您定义的函数和元组列表作为参数。在
multiprocessing.Pool
的^{imap_unordered
返回的迭代器将在结果可用时立即开始生成结果。你可以打印出来以显示进度。在编辑
注:如果你使用的
Downloader
对象的唯一方法是run()
,那么它不应该是一个object。这是伪装的功能!在Youtube上查找“停止写作课程”视频并观看。在相关问题 更多 >
编程相关推荐