Python中的多处理<urlopen error =“”ftp =“”error =“”>下载文件时</urlopen>

时间:2014-06-25 20:58:14

标签: python multiprocessing

这是一个问题,是从上一个问题产生的(见Downloading a LOT of files using 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: >

奇怪的是,如果我一次下载一个文件,我就不会收到此错误。并且错误(通常)不一致。如果我运行两次相同的进程,它将抛出相同的错误,但在不同的文件上。这让我认为问题是线程的交互。也许有2个线程试图同时ping该网站?有谁知道可能导致这种情况的原因?

我使用的机器是运行RedHat且具有32个核心的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)

1 个答案:

答案 0 :(得分:0)

进程仅限于在给定时间打开特定数量的文件指针。 urllib2.urlopen(url)打开文件指针(套接字)。完成数据后,请务必将其关闭:u.close()