Невозможно закрыть поток, открытый Pycurl - PullRequest
4 голосов
/ 24 сентября 2010

Я работаю над клиентом для веб-службы, использующей pycurl.Клиент открывает соединение с потоковым сервисом и порождает его в отдельный поток.Вот урезанная версия того, как устанавливается соединение:

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

Что, в некотором роде, имеет смысл, соединение постоянно открыто.Я охотился вокруг и, похоже, не могу найти способ обойти эту проблему и полностью закрыть соединение.

Ответы [ 2 ]

1 голос
/ 24 сентября 2010

Похоже, что вы вызываете close () в одном потоке, в то время как другой поток выполняет execute ().К счастью, библиотека предупреждает вас, а не спускается в неизвестную область поведения.

Вы должны использовать сеанс curl только из одного потока - или чтобы поток execute () каким-то образом общался, когда завершен вызов execute ()..

0 голосов
/ 12 ноября 2010

Вы, очевидно, продемонстрировали некоторые методы из класса оболочки curl, что вам нужно сделать, чтобы объект сам себя обработал.

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

и не вызывайте закрытие явно. Когда объект завершит свою работу и все ссылки на него будут удалены, соединение curl будет закрыто.

...