2

私はPythonのマルチプロセッシングを使用して、FTPを使用して一括ダウンロードを実行しています。ただし、5つを超えるftpセッションを開こうとすると、EOFErrorが発生します。これは、開いているセッションが多すぎるためにホストが切断していることを意味します。

私が見る唯一の解決策は、単一のFTPオブジェクトを開き、それを必要なメソッドに渡すことです。問題は、マルチプロセッシングではピクルスを使用してオブジェクトを移動し、FTPオブジェクトをピクルスにできないため、これが不可能なことです。したがって、私の質問は、FTPオブジェクトをピクルスにする方法を見つけることによってこれを回避することが可能かどうかです。

私のコードは次の形式です。

def get_file(name):
    #code here    

def worker(name_list, out_q):
    lst = []
    for name in name_list:
        lst.append(get_file(name))
    out_q.put(lst)

if __name__ == '__main__':

    #est ftp cnxn
    ftp = FTP('ftp.blah.blah', 'anonymous', 'meow')

    #multiprocessing code here

get_file defはftp接続にアクセスする必要があり、if __name__ == '__main__'ブロックの外に置くと、プロセスがコードを実行するたびに新しいftp接続が作成されます。

4

2 に答える 2

2

なぜあなたがそれをしたいのか私は本当に理解していません:

  • ものを並行してダウンロードするための一連のプロセスを作成する
  • ただし、FTPオブジェクトは1つだけ使用し、実際にはダウンロードをシリアル化します。

これはあなたの問題をどの程度正確に解決しますか?

ただし、FTPオブジェクトをシリアル化する代わりに、FTP要求のプロセスを作成し、そのプロセスと通信するためのミニ言語を考案します。他のプロセスにフォームの(簡単に選択できる)メッセージを送信させますget src dst

編集:ドキュメントを確認しました[ftplib][1]。複数の通話を処理できるとはどこにも言えません。そうではないと思います!

だから、私はこれを行います:

  • 作成MAX_CONNECTIONS(例:5)FTPワーカープロセス
  • 取得するファイルのキューがあるマスタープロセスに連絡する
  • ワーカープロセスはキューからタスクを取得し、ファイルをダウンロードして、マスターに新しい処理がないかチェックします
  • 作業が完了するまで繰り返します
于 2012-07-11T14:34:53.443 に答える
2

FTP オブジェクトをラップする pickleable クラスを作成することで、この問題を回避できる場合があります。基本的に、ラッパー クラスで FTP コンストラクターの引数をバインドし、リモート ホストで逆シリアル化されると、そこで FTP オブジェクトがインスタンス化されます。

于 2012-07-11T14:28:17.597 に答える