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,如需转载请自行联系原作者
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值