1

我们不断地从我们的数据库中生成数据文件,然后通过 FTP'D 传输到不同的位置。我们有一个持续监控这个文件夹的poler,一旦它看到文件,它就会通过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

3 回答 3

5

您可能会发现multiprocessing.Pool作为更高级别的接口很有用。

from multiprocessing import Pool
def upload(file): 
    ftp = ftplib.FTP('domainname.com')
    ftp.login("username","password")
    f = open(file,'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

于 2012-10-02T20:28:57.717 回答
1

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

于 2012-10-02T20:40:44.137 回答
-1

把耗时的任务放到一个函数中

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()
于 2012-10-02T20:15:51.303 回答