我们不断从我们的数据库生成数据文件,然后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密集型多处理是要走的路,任何关于如何继续的想法。
答案 0 :(得分: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
。
答案 1 :(得分:1)
我手边没有代码片段,但对于生产环境,我肯定会看Twisted。 Twisted并不是最容易上手的工具,但是它带来了很多你将在以后自己实现的东西。所以我建议至少花几个小时检查一下。
答案 2 :(得分:-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()