【问题标题】:Avoid Subprocess Timeouts避免子进程超时
【发布时间】:2013-01-08 17:15:48
【问题描述】:

好的,所以我目前正在使用 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 控制台命令时不会发生这种情况)。

似乎 subprocess 做了一些不同的事情?我什至不特别关心监控它。事实上,如果我与服务器的连接被弄乱了,我宁愿进程不要终止。任何报道都是肉汁。

错误信息:

 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

【问题讨论】:

  • 你使用什么 Python 版本?
  • 对不起,不记得放原帖了。 2.7.3
  • 请发布准确的错误消息,而不是or something。谢谢!
  • 抱歉,有时需要一段时间才会出现。

标签: python


【解决方案1】:

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

该行表明 socket.timeout 正在其中一个子进程中引发。我怀疑是您的 ftp.login 超时。根据the ftplib documentation,如果您在创建对象时未指定,则全局默认超时将由 FTP 对象使用。

附带说明,我建议使用this question 的回答者建议的方法之一,以便在子进程中发生异常时将更多细节传递回主线程。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-05-04
    • 2012-09-23
    • 2012-05-13
    • 2019-12-31
    • 1970-01-01
    • 2018-06-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多