Common lisp 如何使用drakma的分段输出实现超时

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

Drakma目前不支持,但我需要一个超时,返回传输到超时发生时间点的内容

这是我当前的工作尝试,但可能非常适合DailyWTF而不是生产代码:

(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套接字,这将更容易实现。