Python中多进程下载文件时遇到<urlopen error ftp error>

1 投票
1 回答
890 浏览
提问于 2025-04-18 11:05

这个问题是从之前的一个问题引申出来的(可以查看使用Python下载大量文件),但它比我最初问的要具体得多,所以我觉得它应该单独提问。

在使用Python的多进程功能时,如果我尝试同时下载一批文件,使用线程会导致一些文件出现错误。这个错误很明显,是urllib2在打开文件时出错,但问题是,为什么会这样呢?

Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
  File "/usr/local/lib64/anaconda/lib/python2.7/multiprocessing/pool.py", line 250, in map
    return self.map_async(func, iterable, chunksize).get()
  File "/usr/local/lib64/anaconda/lib/python2.7/multiprocessing/pool.py", line 554, in get
    raise self._value
urllib2.URLError: <urlopen error ftp error: >

奇怪的是,如果我一个一个地下载文件,就不会出现这个错误。而且这个错误通常也不是固定的。如果我运行同样的过程两次,可能会在不同的文件上出现同样的错误。这让我觉得问题可能出在线程之间的相互作用上。也许有两个线程同时在访问同一个网站?有没有人知道这可能是什么原因呢?

我使用的机器是运行RedHat的LinuxBox,拥有32个核心。

以下是我使用的代码:

from __future__ import division
import pandas as pd
import numpy as np
import urllib2
import os
import linecache
from multiprocessing import Pool
import time

#making our list of urls to download from
data2=pd.read_csv("edgar14A14C.csv")

flist=np.array(data2['filename'])
print len(flist)
print flist

os.chdir(str(os.getcwd())+str('/edgar14A14C'))

###below we have a script to download all of the files in the data2 database
###here you will need to create a new directory named edgar14A14C in your CWD

def job(url):
    print "I'm doing something!"
    file_name = str(url.split('/')[-1])
    u = urllib2.urlopen(url)
    f = open(file_name, 'wb')
    f.write(u.read())
    print file_name
    f.close()


urls = ["ftp://ftp.sec.gov/{0:s}".format(f) for f in flist]
pool = Pool(processes=20)
pool.map(job, urls)

1 个回答

0

每个程序在同一时间只能打开一定数量的文件指针。比如,当你使用 urllib2.urlopen(url) 这个命令时,它会打开一个文件指针(其实就是一个网络连接)。当你用完这些数据后,一定要记得关闭它,使用 u.close() 这个命令。

撰写回答