我编写了一个通过 celery 异步运行任务的功能,在本地进行了测试,一切正常。运送到我的暂存环境,当 celery 尝试使用任务时,它会失败并出现以下回溯。
我什至不确定如何调试这个错误,因为它是由 celery 调用的,并且发生在 python 标准库的深处。有什么想法吗?
Traceback (most recent call last):
File "/home/ubuntu/hypnos-venv/local/lib/python2.7/site-packages/celery/app/trace.py", line 238, in trace_task
R = retval = fun(*args, **kwargs)
File "/home/ubuntu/hypnos-venv/local/lib/python2.7/site-packages/celery/app/trace.py", line 416, in __protected_call__
return self.run(*args, **kwargs)
File "/home/ubuntu/Hypnos/hypnos/recs_jobber/tasks.py", line 5, in send_sms_action
msg = twilio_client.sms.messages.create(body = sms_action.body, to=sms_action.to_number, from_=TW_NUMBER)
File "/home/ubuntu/hypnos-venv/local/lib/python2.7/site-packages/twilio/rest/resources/sms_messages.py", line 167, in create
return self.create_instance(kwargs)
File "/home/ubuntu/hypnos-venv/local/lib/python2.7/site-packages/twilio/rest/resources/base.py", line 352, in create_instance
data=transform_params(body))
File "/home/ubuntu/hypnos-venv/local/lib/python2.7/site-packages/twilio/rest/resources/base.py", line 204, in request
resp = make_twilio_request(method, uri, auth=self.auth, **kwargs)
File "/home/ubuntu/hypnos-venv/local/lib/python2.7/site-packages/twilio/rest/resources/base.py", line 129, in make_twilio_request
resp = make_request(method, uri, **kwargs)
File "/home/ubuntu/hypnos-venv/local/lib/python2.7/site-packages/twilio/rest/resources/base.py", line 101, in make_request
resp, content = http.request(url, method, headers=headers, body=data)
File "/home/ubuntu/hypnos-venv/local/lib/python2.7/site-packages/httplib2/__init__.py", line 1570, in request
(response, content) = self._request(conn, authority, uri, request_uri, method, body, headers, redirections, cachekey)
File "/home/ubuntu/hypnos-venv/local/lib/python2.7/site-packages/httplib2/__init__.py", line 1317, in _request
(response, content) = self._conn_request(conn, request_uri, method, body, headers)
File "/home/ubuntu/hypnos-venv/local/lib/python2.7/site-packages/httplib2/__init__.py", line 1252, in _conn_request
conn.connect()
File "/home/ubuntu/hypnos-venv/local/lib/python2.7/site-packages/httplib2/__init__.py", line 1017, in connect
sock.settimeout(self.timeout)
File "/usr/lib/python2.7/socket.py", line 224, in meth
return getattr(self._sock,name)(*args)
TypeError: a float is required
使用 Celery 的 rdb 进入框架,似乎没有设置套接字超时。
(Pdb) self.timeout
<Unset Timeout Value>
有什么办法可以解决这个问题吗?错误来自 Twilio -> httplib2 -> socket.py,它是 _socket 的包装器。这是我的头,甚至不知道如何解决这个问题。
请您参考如下方法:
默认情况下,Twilio 的库将超时设置为:
class _UnsetTimeoutKls(object):
""" A sentinel for an unset timeout. Defaults to the system timeout. """
def __repr__(self):
return '<Unset Timeout Value>'
# None has special meaning for timeouts, so we use this sigil to indicate
# that we don't care
UNSET_TIMEOUT = _UnsetTimeoutKls()
因此,在实例化 TwilioRestClient 和将 _UnsetTimeoutKls 评估为不同于 None 的实际套接字调用之间一定发生了一些事情。
在初始化 TwilioRestClient 时将超时设置为 None 似乎可以修复错误:
self.client = TwilioRestClient(TWILIO_SID,
TWILIO_AUTH_TOKEN,
timeout=None)
