pycurl 异步请求

简介:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
#!/usr/bin/python
# coding:utf8
from  __future__  import  division
import  pycurl
import  simplejson as json
 
try :
     import  signal
     from  signal  import  SIGPIPE, SIG_IGN
     signal.signal(signal.SIGPIPE, signal.SIG_IGN)
except  ImportError:
     pass
 
def  curlmulti_tsdb(urls):
     num_conn  =  20 
 
     queue  =  []
     for  url  in  urls:
         url  =  url.strip()
         filename  =  "url_%03d.dat"  %  ( len (queue) + 1 )
         queue.append((url, filename))
 
     num_urls  =  len (urls)
     num_conn  =  min (num_conn, num_urls)
 
     =  pycurl.CurlMulti()
     m.handles  =  []
 
     for  in  range (num_conn):
         =  pycurl.Curl()
         c.fp  =  None
         c.setopt(pycurl.FOLLOWLOCATION,  1 )
         c.setopt(pycurl.MAXREDIRS,  5 )
         c.setopt(pycurl.CONNECTTIMEOUT,  5 )
         c.setopt(pycurl.TIMEOUT,  100 )
         c.setopt(pycurl.NOSIGNAL,  1 )
         m.handles.append(c)
 
     #main loop
     freelist  =  m.handles[:]
     num_processed  =  0
 
     while  num_processed < num_urls:
         while  queue  and  freelist:
             url, filename  =  queue.pop()
             =  freelist.pop()
             c.fp  =  open (filename,  "wb" )
             c.setopt(pycurl.URL, url)
             c.setopt(pycurl.WRITEDATA, c.fp)
             m.add_handle(c)
             c.filename  =  filename
             c.url  =  url
 
         while  1 :
             ret, num_handles  =  m.perform()
             if  ret ! =  pycurl.E_CALL_MULTI_PERFORM:
                 break
 
         while  1 :
             num_q, ok_list, err_list  =  m.info_read()
             for  in  ok_list:
                 c.fp.close()
                 c.fp  =  None
                 with  open (c.filename,  "rb" ) as f:
                     print  f.readlines()
                 m.remove_handle(c)
                 freelist.append(c)
 
             for  c, errno, errmsg  in  err_list:
                 c.fp.close()
                 c.fp  =  None
                 m.remove_handle(c)
                 print  "Failed:" , c.url, errno, errmsg
                 freelist.append(c)
 
             num_processed  =  num_processed  +  len (ok_list)  +  len (err_list)
 
             if  num_q  = =  0 :
                 break
 
         m.select( 1.0 )
 
     for  in  m.handles:
         if  c.fp  is  not  None :
             c.fp.close()
             c.fp  =  None
 
         c.close()
 
     m.close()










本文转自 Art_Hero 51CTO博客,原文链接:http://blog.51cto.com/curran/1682034,如需转载请自行联系原作者
目录
相关文章
|
7月前
|
JSON 数据格式
使用axios发送get和post请求
使用axios发送get和post请求
115 0
|
2月前
|
JSON JavaScript 前端开发
axios的post请求,数据为什么要用qs处理?什么时候不用?
axios的post请求,数据为什么要用qs处理?什么时候不用?
|
3月前
|
数据采集 Web App开发 开发工具
|
4月前
|
XML 前端开发 JavaScript
Ajax、Fetch、Axios
Ajax、Fetch、Axios
78 25
|
4月前
|
Python
异步请求 aiohttp
【8月更文挑战第11天】
52 11
|
6月前
|
JSON API 数据安全/隐私保护
CURL 发送POST请求
CURL 发送POST请求
|
6月前
|
JSON 前端开发 JavaScript
Axios是一个基于Promise的HTTP客户端
Axios是一个基于Promise的HTTP客户端
40 0
|
7月前
|
Web App开发 JSON 网络安全
CURL发送POST请求
CURL发送POST请求
287 0
|
JSON 数据格式
OkHttp3发起POST或GET请求
OkHttp3发起POST或GET请求
470 0