1

データベースからデータファイルを継続的に生成し、それを別の場所にFTPで転送します。このフォルダを継続的に監視するポーラーがあり、ファイルを確認するとすぐに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 に答える