# -*- coding: utf-8 -*-
"""
Async IO vs multi-threading

Multi-thread:           5.9 secs (10 threads) for 100 requests
Async-IO with Gevent:   10.5 secs  for 100 requests
Single thread:          86.0 secs for 100 requests
"""
import sys
import logging
import Queue
import os

from threading import activeCount
from threading import Thread
from cookielib import CookieJar as cj
from unit_tests import read_urls

try:  # Python 2.7+
    from logging import NullHandler
except ImportError:
    class NullHandler(logging.Handler):
        def emit(self, record):
            pass

logging.getLogger(__name__).addHandler(NullHandler())
log = logging.getLogger(__name__)

PARENT_DIR = os.path.dirname(os.path.abspath(__file__))
sys.path.insert(0, os.path.join(PARENT_DIR, '..'))

from newspaper.network import multithread_request, sync_request
from newspaper.utils import print_duration

@print_duration
def naive_run(urls):
    """no multithreading or async io"""

    resps = []
    for url in urls:
        resps.append(sync_request(url))
    print resps

@print_duration
def mthread_run(urls):
    """download a bunch of urls via multithreading"""

    # print 'beginning batch job for async io, %s threads running' % activeCount()
    reqs = multithread_request(urls)
    resps = [req.resp for req in reqs]

@print_duration
def asyncio_run(urls):
    """download a bunch of urls via async io"""

    pass
    # rs = (grequests.request('GET', u, **req_kwargs) for u in urls)
    # responses = async_request(urls)
    # print responses

def benchmark():
    """multi-threading vs async-io vs regular"""

    urls = read_urls(amount=1000)
    #naive_run(urls)
    mthread_run(urls)
    #asyncio_run(urls)

benchmark()
