python – 使用精确连接数进行多处理FTP上传
作者:互联网
因此,我已经能够使用多处理一次将多个文件上传到给定的服务器,具有以下两个功能:
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”,“打开SERVER”,“用户USERNAME PASSWORD”,“mput * .rar”)时,我没有收到此错误,即使我有(例如)3个实例这一次运行.
我已经阅读了ftplib和多处理文档,我无法弄清楚导致这些错误的原因.这有点问题,因为我经常备份大量数据和大量文件.
>有什么方法可以避免这些错误,或者有一种不同的方式让/ a脚本执行此操作?
>有没有办法告诉脚本,如果它有这个错误,它应该等待一秒钟,然后恢复它的工作?
>有没有办法让脚本按照它们在列表中的顺序上传文件(当然速度差异意味着它们并不总是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,multiprocessing,ftplib 来源: https://codeday.me/bug/20190901/1781493.html