【问题标题】:Unable to close a stream opened with pycurl无法关闭用 pycurl 打开的流
【发布时间】:2011-04-16 20:26:09
【问题描述】:

我正在开发一个使用 pycurl 的 Web 服务客户端。客户端打开到流服务的连接并将其生成到单独的线程中。这是连接设置的精简版:

def _setup_connection(self):
    self.conn = pycurl.Curl()
    self.conn.setopt(pycurl.URL, FILTER_URL)
    self.conn.setopt(pycurl.POST, 1)
    .
    .
    .
    self.conn.setopt(pycurl.HTTPHEADER, headers_list)
    self.conn.setopt(pycurl.WRITEFUNCTION, self.local_callback)

def up(self):
    if self.conn is None:
        self._setup_connection()
    self.perform()

现在,当我想关闭连接时,如果我打电话

self.conn.close()

我得到以下异常:

error: cannot invoke close() - perform() is currently running

这在某种程度上是有道理的,连接是不断打开的。我一直在寻找,似乎找不到任何方法来规避这个问题并干净地关闭连接。

【问题讨论】:

标签: python multithreading pycurl


【解决方案1】:

听起来您正在一个线程中调用 close(),而另一个线程正在执行 perform()。幸运的是,图书馆会警告您,而不是陷入未知的行为领域。

您应该只使用来自一个线程的 curl 会话 - 或者在对 perform() 的调用完成时让 perform() 线程以某种方式进行通信。

【讨论】:

  • 我正在使用发送到包含 pycurl 连接的线程的信号来启动 self.conn.close() 调用。问题是,除非出现错误和超时,否则 perform() 永远不会完成,信息将继续流式传输,直到任何一方关闭连接(我正在与 twitter 流 api 接口,如果这有帮助的话)。
【解决方案2】:

你显然展示了 curl 包装类的一些方法,你需要做的是让对象自己处理。

def __del__(self):
    self.conn.close()

并且不要显式调用结束。当对象完成它的工作并且对它的所有引用都被删除时,curl 连接将被关闭。

【讨论】:

    猜你喜欢
    • 2012-11-26
    • 1970-01-01
    • 2020-12-13
    • 1970-01-01
    • 2013-03-03
    • 2016-12-03
    • 2017-03-01
    • 2012-03-19
    • 2016-02-06
    相关资源
    最近更新 更多