Python 中的多处理<urlopen 错误 ftp 错误>下载文件时



这个问题是从之前的一个问题衍生出来的(请参阅使用Python下载大量文件),但比我最初的问题要具体得多,我认为它应该有一个单独的问题。

当运行python multiprocessing时,如果我尝试一次使用线程下载一批文件,它只会在一些文件上抛出错误。这是错误,显然有一个错误与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: >

奇怪的是,如果我一次下载一个文件,我没有得到这个错误。误差(通常)是不一致的。如果我运行相同的进程两次,它将抛出相同的错误,但在不同的文件。这让我想到问题出在线程的交互上。也许2线程试图ping网站在同一时间?有人知道是什么引起的吗?

我使用的机器是运行32核RedHat的LinuxBox。

下面是我使用的代码:
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)

进程在给定时间只能打开特定数量的文件指针。urllib2.urlopen(url)打开文件指针(套接字)。处理完数据后,请确保关闭它:u.close()

相关内容

最新更新