2012-10-02 94 views
1

我们不断从我们的数据库生成数据文件,然后FTP'D到不同的位置。我们有一个poler,因为它认为它的文件FTP是他们python ftp文件线程或多进程

目前这个过程是连续的,当这些文件得到广大有导致显著延迟一个备份汽车无监控此文件夹,并尽快。我想并行处理事件,即一次FTP多个文件。我不确定线程​​/多处理,以及这对我如何工作。

这里是我的代码

import ftplib 
ftp = ftplib.FTP('domainname.com') 
ftp.login("username","password") 
infiles = [file1,file2,file3.....filen] 
for x in infiles: 
    f = open(x,'rb') 
    ftp.storbinary('STOR %s' %x, f) 
    f.close() 
ftp.quit() 

我的想法,因为这是I/O密集的多处理是要走的路,对如何进行任何想法。

回答

4

您可能会发现multiprocessing.Pool作为一个高级接口非常有用。

from multiprocessing import Pool 
def upload(file): 
    ftp = ftplib.FTP('domainname.com') 
    ftp.login("username","password") 
    f = open(x,'rb') 
    ftp.storbinary('STOR %s' %x, f) 
    f.close() 
    ftp.quit() 


infiles = [file1,file2,file3.....filen] 

pool = Pool(10) # submit 10 at once 
pool.map(upload,infiles) 

这很好,因为map的行为就像内建函数。对于调试,只需更换pool.map - >map

+0

如果是I/O绑定,那么你可以使用'multiprocessing.pool.ThreadPool'代替(接口是相同的,唯一的改变是导入)。 – jfs

0

把耗时的任务时为功能

from multiprocessing import Process 

def upload_file(filename): 
    ftp = ftplib.FTP('domainname.com') 
    ftp.login("username","password") 
    f = open(x,'rb') 
    ftp.storbinary('STOR %s' %x, f) 
    f.close() 
    ftp.quit() 

def multi_ftp(): 
    files = [file1, file2, ...] 
    processes = [] 
    for filename in files: 
     p = Process(target=filename, args=(filename,)) 
     p.start() 
     processes.append(p) 

    for p in processes: 
     p.join() 
1

我不手边有一个代码片段,但对于生产环境中我会definitivly看Twisted。 Twisted并不是最容易入门的工具,但它带来了很多你以后会自己实现的东西。所以我会建议花费至少几个小时检查一下。