Curl多对象

class pycurl.CurlMulti

创建一个新的 Curl多对象 它对应于一个 CURLM Libcurl中的句柄。

CurlMulti对象有以下方法:

close() None

对应于 curl_multi_cleanup 在libcurl。当CurlMulti对象不再具有对它的任何引用时,此方法由pycurl自动调用,但也可以显式调用。

add_handle(Curl object) None

对应于 curl_multi_add_handle 在libcurl。此方法将现有的有效Curl对象添加到CurlMulti对象。

Changed in version 7.43.0.2: ADD_HANDLE现在确保Curl对象在由CurlMulti对象使用时不会被垃圾回收。以前,应用程序必须维护对Curl对象的未完成引用,以防止它被垃圾收集。

remove_handle(Curl object) None

对应于 curl_multi_remove_handle 在libcurl。此方法从CurlMulti对象中移除现有的有效Curl对象。

perform() tuple of status and the number of active Curl objects

对应于 curl_multi_perform 在libcurl。

socket_action(sock_fd, ev_bitmask)

返回在给定超时时对cURL多文件描述符执行Socket_action()的结果。对应于 curl_multi_socket_action 在libcurl。

返回值是由两个元素组成的元组。第一个元素是基础 curl_multi_socket_action 函数,并且始终为零。 (CURLE_OK ),因为任何其他返回值都会导致 socket_action 来引发一个例外。第二个元素是此多句柄中运行的轻松句柄的数量。当运行句柄的数量为零时,所有传输均已完成。请注意,如果运行句柄的数量与上一次调用相比减少了1,这并不意味着与 sock_fd 作为此函数的参数提供的是完整的句柄。

socket_all() tuple

返回在给定超时时对cURL多文件描述符执行Socket_All()的结果。

setopt(option, value) None

设置Curl多选项。对应于 curl_multi_setopt 在libcurl。

option 指定要设置的选项。PycURL定义了与 CURLMOPT_* Libcurl中的常量,除了 CURLMOPT_ 前缀替换为 M_ 前缀。例如, CURLMOPT_PIPELINING 在PycURL中公开为 pycurl.M_PIPELINING 。为了方便起见, CURLMOPT_* 常量也在CurlMulti对象上公开::

import pycurl
m = pycurl.CurlMulti()
m.setopt(pycurl.M_PIPELINING, 1)
# Same as:
m.setopt(m.M_PIPELINING, 1)

value 指定要将该选项设置为的值。不同的选项接受不同类型的值:

  • 由指定的选项 curl_multi_setopt 作为接受 1 或一个整数值,接受Python整数、长整型(在Python2.x上)和布尔值:

    m.setopt(pycurl.M_PIPELINING, True)
    m.setopt(pycurl.M_PIPELINING, 1)
    # Python 2.x only:
    m.setopt(pycurl.M_PIPELINING, 1L)
    
  • *FUNCTION 选项接受一个函数。支持的回调包括 CURLMOPT_SOCKETFUNCTION AND CURLMOPT_TIMERFUNCTION 。有关使用回调的示例,请参考PycURL测试套件。

当选项值不是相应选项接受的类型时引发TypeError,当libcurl拒绝该选项或其值时引发pycurl.error异常。

fdset() tuple of lists with active file descriptors, readable, writeable, exceptions

返回一个由三个列表组成的元组,这些列表可以传递给selt.select()方法。

对应于 curl_multi_fdset 在libcurl。此方法从CurlMulti对象中提取文件描述符信息。返回的列表可以与 select 模块轮询事件。

示例用法::

import pycurl
c = pycurl.Curl()
c.setopt(pycurl.URL, "https://curl.haxx.se")
m = pycurl.CurlMulti()
m.add_handle(c)
while 1:
    ret, num_handles = m.perform()
    if ret != pycurl.E_CALL_MULTI_PERFORM: break
while num_handles:
    apply(select.select, m.fdset() + (1,))
    while 1:
        ret, num_handles = m.perform()
        if ret != pycurl.E_CALL_MULTI_PERFORM: break
select([timeout]) number of ready file descriptors or 0 on timeout

返回在给定的超时时间内对cURL多文件描述符执行SELECT()的结果。

这是一个方便的函数,它简化了 fdset() 以及 select 模块。

示例用法::

import pycurl
c = pycurl.Curl()
c.setopt(pycurl.URL, "https://curl.haxx.se")
m = pycurl.CurlMulti()
m.add_handle(c)
while 1:
    ret, num_handles = m.perform()
    if ret != pycurl.E_CALL_MULTI_PERFORM: break
while num_handles:
    ret = m.select(1.0)
    if ret == 0:  continue
    while 1:
        ret, num_handles = m.perform()
        if ret != pycurl.E_CALL_MULTI_PERFORM: break
info_read([max_objects]) -> tuple(number of queued messages, a list of successful objects, a list of failed objects)

对应于 curl_multi_info_read 函数在libcurl中。

这种方法最多只能提取 max 来自多堆栈的消息,并在两个列表中返回它们。第一个列表包含成功完成的句柄,第二个列表包含一个元组 (curl object, curl error number, curl error message) 对于每个失败的Curl对象。CURL错误消息以Python字符串的形式返回,该字符串使用 surrogateescape 错误处理程序。还会返回调用此方法后排队的消息数。

timeout() int

返回在继续之前等待操作的时间。对应于 curl_multi_timeout 在libcurl。

assign(sock_fd, object) None

在多句柄中创建给定套接字和应用程序中的私有对象之间的关联。对应于 curl_multi_assign 在libcurl。