这是一个问题,是从上一个问题产生的(见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)
答案 0 :(得分:0)
进程仅限于在给定时间打开特定数量的文件指针。 urllib2.urlopen(url)
打开文件指针(套接字)。完成数据后,请务必将其关闭:u.close()