gpt4 book ai didi

python - 具有精确连接数的多处理 FTP 上传

转载 作者:太空宇宙 更新时间:2023-11-03 14:28:55 24 4
gpt4 key购买 nike

因此,我已经能够使用 multiprocessing 将多个文件一次上传到具有以下两个功能的给定服务器:

import ftplib,multiprocessing,subprocess

def upload(t):
server=locker.server,user=locker.user,password=locker.password,service=locker.service #These all just return strings representing the various fields I will need.
ftp=ftplib.FTP(server)
ftp.login(user=user,passwd=password,acct="")
ftp.storbinary("STOR "+t.split('/')[-1], open(t,"rb"))
ftp.close() # Doesn't seem to be necessary, same thing happens whether I close this or not

def ftp_upload(t=files,server=locker.server,user=locker.user,password=locker.password,service=locker.service):
parsed_targets=parse_it(t)
ftp=ftplib.FTP(server)
ftp.login(user=user,passwd=password,acct="")
remote_files=ftp.nlst(".")
ftp.close()
files_already_on_server=[f for f in t if f.split("/")[-1] in remote_files]
files_to_upload=[f for f in t if not f in files_already_on_server]
connections_to_make=3 #The maximum connections allowed the the server is 5, and this error will pop up even if I use 1
pool=multiprocessing.Pool(processes=connections_to_make)
pool.map(upload,files_to_upload)

我的问题是我(经常)最终会遇到如下错误:

File "/usr/lib/python2.7/multiprocessing/pool.py", line 227, in map
return self.map_async(func, iterable, chunksize).get()
File "/usr/lib/python2.7/multiprocessing/pool.py", line 528, in get
raise self._value
ftplib.error_temp: 421 Too many connections (5) from this IP

注意:偶尔也会出现超时错误,但我正在等待它再次抬起丑陋的头,到时候我会发布它。

当我使用命令行(即“ftp -inv”、“open SERVER”、“user USERNAME PASSWORD”、“mput *.rar”)时,即使我有(例如) 一次运行 3 个实例。

我通读了 ftplib 和多处理文档,但我无法弄清楚是什么导致了这些错误。这有点问题,因为我经常备份大量数据和大量文件。

  1. 有什么方法可以避免这些错误,或者是否有不同的方法让脚本执行此操作?
  2. 有什么方法可以告诉脚本,如果出现此错误,它应该稍等片刻,然后继续工作?
  3. 有没有办法让脚本按照文件在列表中的相同顺序上传文件(当然,速度差异意味着它们不会总是 4 个连续的文件,但目前顺序似乎基本上随机)?
  4. 有人可以解释为什么/如何同时与该服务器建立比脚本要求的连接更多的连接吗?

所以,只处理异常似乎是有效的(除了偶尔的递归错误......仍然他妈的不知道那里到底发生了什么)。

根据#3,我并不是在寻找 100% 的顺序,只是脚本会选择列表中的下一个文件进行上传(因此进程速度的差异可能/仍然会导致顺序不正确要完全按顺序排列,与当前系统相比,可变性会更少,而当前系统似乎几乎是无序的)。

最佳答案

您可以尝试为每个进程使用单个 ftp 实例:

def init(*credentials):
global ftp
server, user, password, acct = credentials
ftp = ftplib.FTP(server)
ftp.login(user=user, passwd=password, acct=acct)

def upload(path):
with open(path, 'rb') as file:
try:
ftp.storbinary("STOR " + os.path.basename(path), file)
except ftplib.error_temp as error: # handle temporary error
return path, error
else:
return path, None

def main():
# ...
pool = multiprocessing.Pool(processes=connections_to_make,
initializer=init, initargs=credentials)
for path, error in pool.imap_unordered(upload, files_to_upload):
if error is not None:
print("failed to upload %s" % (path,))

关于python - 具有精确连接数的多处理 FTP 上传,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15053602/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com