Common lisp 如何使用drakma的分段输出实现超时
Drakma目前不支持,但我需要一个超时,返回传输到超时发生时间点的内容 这是我当前的工作尝试,但可能非常适合DailyWTF而不是生产代码:Common lisp 如何使用drakma的分段输出实现超时,common-lisp,sbcl,drakma,Common Lisp,Sbcl,Drakma,Drakma目前不支持,但我需要一个超时,返回传输到超时发生时间点的内容 这是我当前的工作尝试,但可能非常适合DailyWTF而不是生产代码: (defun perform-request (url parameters method) (let ((string nil)) (restart-case (sb-ext:with-timeout 20 (let ((stream (drakma:http-request url
(defun perform-request (url parameters method)
(let ((string nil))
(restart-case
(sb-ext:with-timeout 20
(let ((stream (drakma:http-request url
:method method
:parameters parameters
:want-stream T)))
(unwind-protect
(do ((char (read-char stream nil nil)
(read-char stream nil nil)))
(nil nil)
(when char
(push char string)))
(close stream))))
(ignore ()
"")
(default ()
(coerce (reverse string) 'string)))))
这一尝试确实存在一些严重缺陷:
- 该方法的运行时间不能短于给定的超时时间
- 使用带有超时的hack从while-true循环返回,并对
重新启动案例进行bastarding以获得适当的返回值,这感觉是错误的
- 逐字符读取流会在CPU上造成很大的负载(而不是等待加载完成,然后进行批量读取)
如何正确读取drakma流,直到某个超时(或EOF),然后返回读入字符串?是否必须使用drakma?如果使用具有延迟的异步http客户端,或者可能使用原始TCP套接字,这将更容易实现。