Python 用于is直接批处理任务的luigi批处理模块
我有500个链接要下载,并想批量他们的例子10个项目 这个伪代码是什么样子的Python 用于is直接批处理任务的luigi批处理模块,python,parallel-processing,luigi,Python,Parallel Processing,Luigi,我有500个链接要下载,并想批量他们的例子10个项目 这个伪代码是什么样子的 class BatchJobTask(luigi.Task) items = luigi.Parameter() def run(self): listURLs = [] with ('urls_chunk', 'r') as urls for line in urls: listURLs.append('http:
class BatchJobTask(luigi.Task)
items = luigi.Parameter()
def run(self):
listURLs = []
with ('urls_chunk', 'r') as urls
for line in urls:
listURLs.append('http://ggg'+line+'.org')
10_urls = listURLs[0:items] #10 items here
for i in 10_urls:
req = request.get(url)
req.contents
def output(self):
return self.LocalTarger("downloaded_filelist.txt")
class BatchWorker(luigi.Task)
def run(self)
# Here I should run BatchJobTask from 0 to 10, next 11 - 21 new etc...
它会是怎样的?这里有一种方法,可以做一些您想要做的事情,但是字符串列表存储在文件中作为单独的行
import luigi
import requests
BATCH_SIZE = 10
class BatchProcessor(luigi.Task):
items = luigi.ListParameter()
max = luigi.IntParameter()
def requires(self):
return None
def output(self):
return luigi.LocalTarget('processed'+str(max)+'.txt')
def run(self):
for item in self.items:
req = requests.get('http://www.'+item+'.org')
# do something useful here
req.contents
open("processed"+str(max)+".txt",'w').close()
class BatchCreator(luigi.Task):
file_with_urls = luigi.Parameter()
def requires(self):
required_tasks = []
f = open(self.file_with_urls)
batch_index = 0
total_index = 0
lines = []
while True:
line = f.readline()
if not line: break
total_index += 1
if batch_index < BATCH_SIZE:
lines.append(line)
batch_index += 1
else:
required_tasks.append(BatchProcessor(batch=lines))
lines = [line]
batch_index = 1
return required_tasks
def output(self):
return luigi.LocalTarget(str(self.file_with_urls) + 'processed')
def run(self):
open(str(self.file_with_urls) + 'processed', 'w').close()
导入luigi
导入请求
批量大小=10
类BatchProcessor(luigi.Task):
items=luigi.ListParameter()
max=luigi.IntParameter()
def需要(自我):
一无所获
def输出(自):
返回luigi.LocalTarget('processed'+str(max)+'.txt')
def运行(自):
对于self.items中的项目:
req=请求。获取('http://www.“+项目+”.org“)
#在这里做些有用的事
请求内容
打开(“已处理”+str(max)+“.txt”,“w”).close()
类BatchCreator(luigi.Task):
文件\u的URL=luigi.Parameter()
def需要(自我):
必需的_任务=[]
f=打开(带有URL的self.file\u)
批次索引=0
总指数=0
行=[]
尽管如此:
line=f.readline()
如果不是行:断开
总指数+=1
如果批次索引<批次大小:
行。追加(行)
批次索引+=1
其他:
必需的任务。追加(批处理器(批=行))
行=[行]
批次索引=1
返回所需的任务
def输出(自):
返回luigi.LocalTarget(str(带有URL的self.file)+“已处理”)
def运行(自):
打开(str(self.file_与_url)+“已处理”,“w”).close()
我这样做了
class GetListtask(luigi.Task)
def run(self):
...
def output(self):
return luigi.LocalTarget(self.outputfile)
class GetJustOneFile(luigi.Task):
fid = luigi.IntParameter()
def requires(self):
pass
def run(self):
url = 'http://my-server.com/test' + str(self.fid) + '.txt'
download_file = requests.get(url, stream=True)
with self.output().open('w') as downloaded_file:
downloaded_file.write(str(download_file.content))
def output(self):
return luigi.LocalTarget("test{}.txt".format(self.fid))
class GetAllFiles(luigi.WrapperTask):
def requires(self):
listoffiles = [] # 0..999
for i in range(899):
listoffiles.append(i)
return [GetJustOneFile(fid=fileid) for fileid in listoffiles]
这段代码糟糕吗?你的URL列表在哪里?我已经更新了第一个帖子,意思是URL列表存储在哪里?在队列、数据库、文件中?你要做的是计算出有多少在那东西里,然后从那里建立你的块。我将在下面举个例子,但它不太可能与您的问题相关,因为您没有指定问题的相关部分。嗯,它不进行批处理,但是它应该可以工作。我如何从GetAllFiles中的GetListTask而不是预定义列表中输入文件?这就是我在我的
BatchCreator
任务的requires
方法中显示的,假设您有一个文件,其中文件的每一行都是不同的URN组件。不要在python中使用max
作为变量。另外,您需要参考self.max
以获取本地参数值;此代码无法运行。