避免子进程超时

时间:2013-01-08 17:15:48

标签: python

好的,我现在正在使用python脚本一次将多个文件上传到给定的服务器。

我正在运行python版本2.7.3。

def upload(t):
    server="server"
    user="user"
    password="password"
    service="service"
    ftp=ftplib.FTP(server)
    ftp.login(user=user,passwd=password,acct="")
    ftp.storbinary("STOR "+t.split('/')[-1], open(t,"rb"))
    print "{} has been uploaded to {}".format(t.split("/")[-1],service)
def ftp_upload(t=files):
    server="server"
    user="user"
    password="password"
    service="service"
    ftp.login(user=user,passwd=password,acct="")
    pool=multiprocessing.Pool(processes=4)
    pool.map(upload,t)

但是,我收到错误消息,因为发生了套接字超时或其他事情(当我只使用ftp控制台命令时不会发生这种情况)。

看起来子进程有什么不同吗?我甚至不特别关心它的监测;事实上,如果我与服务器的连接混乱,我宁愿不终止进程。任何报道都是肉汁。

错误讯息:

 File "/usr/bin/jat", line 301, in ftp_upload
    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
socket.timeout: timed out

1 个答案:

答案 0 :(得分:0)

pool.Map()将其管理的子进程中的异常传播到主进程。请注意,异常是从multiprocessing / pool.py报告的,并且回溯以" raise self._value"结束。

该行表示在其中一个子进程中引发了socket.timeout。我怀疑你的ftp.login是超时的。根据{{​​3}},如果您在创建对象时未指定全局默认超时,则FTP对象将使用全局默认超时。

在旁注中,我建议使用the ftplib documentation的回答者建议的方法之一,在子进程中发生异常时,将更多细节传递回主线程。