Skip to content

Instantly share code, notes, and snippets.

@mydreambei-ai
Created May 31, 2017 07:22
Show Gist options
  • Save mydreambei-ai/dbbbb524d665401248e01279a002e31c to your computer and use it in GitHub Desktop.
Save mydreambei-ai/dbbbb524d665401248e01279a002e31c to your computer and use it in GitHub Desktop.
epoll and pycurl multiple example
import pycurl
import select
URLS = ["https://www.douban.com/", "http://mail.163.com", "http://www.sina.com.cn", "http://google.com"]
SOCKETS = set()
TIMEOUT = 10
epoll = select.epoll()
def start_timeout(msecs):
global TIMEOUT, m
print('Timer callback msecs:', msecs)
TIMEOUT = msecs
if msecs < 0:
return
else:
TIMEOUT = msecs
# socket callback
def handle_socket(event, sockfd, multi, data):
print(event, sockfd, multi, data)
if event == pycurl.POLL_REMOVE:
if sockfd in SOCKETS:
SOCKETS.remove(sockfd)
epoll.unregister(sockfd)
else:
if sockfd not in SOCKETS:
SOCKETS.add(sockfd)
if event == pycurl.POLL_IN:
epoll.register(sockfd, select.EPOLLIN)
elif event == pycurl.POLL_OUT:
epoll.register(sockfd, select.EPOLLOUT)
def loop():
while 1:
ret, _ = m.perform()
if ret != pycurl.E_CALL_MULTI_PERFORM: break
while m.handles:
events = epoll.poll(TIMEOUT)
if events:
for sockfd, event in events:
if event & select.EPOLLIN:
while 1:
ret, num = m.socket_action(sockfd, pycurl.CSELECT_OUT)
if ret != pycurl.E_CALL_MULTI_PERFORM: break
while 1:
num, ok_list, err_list = m.info_read()
for c in ok_list:
print(c, c.getinfo(pycurl.TOTAL_TIME))
m.remove_handle(c)
if num == 0:
break
elif event & select.EPOLLOUT:
while 1:
ret, num_handlers = m.socket_action(sockfd, pycurl.CSELECT_IN)
if ret != pycurl.E_CALL_MULTI_PERFORM: break
while 1:
num, ok_list, err_list = m.info_read()
for c in ok_list:
print(c, c.getinfo(pycurl.EFFECTIVE_URL))
c.fp.close()
c.fp = None
m.remove_handle(c)
m.handles.remove(c)
for c in err_list:
print(c, "error")
if num == 0:
break
else:
m.socket_action(pycurl.SOCKET_TIMEOUT, 0)
m = pycurl.CurlMulti()
m.setopt(pycurl.M_PIPELINING, 1)
m.setopt(pycurl.M_SOCKETFUNCTION, handle_socket)
m.setopt(pycurl.M_TIMERFUNCTION, start_timeout)
m.handles = []
for index, u in enumerate(URLS):
c = pycurl.Curl()
c.fp = open("xxx" + str(index), "wb")
m.handles.append(c)
c.setopt(c.URL, u)
c.setopt(pycurl.WRITEFUNCTION, c.fp.write)
c.setopt(pycurl.TIMEOUT, 5)
m.add_handle(c)
loop()
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment