1#!/usr/bin/env python
2"""A test to verify Psycopg collaboration with other blocking I/O.
3
4Please run the script ``tools/wait_server.py`` in a separate shell to make the
5test work.
6
7If the test works you should see download tasks overlapping query tasks.
8"""
9
10# Copyright (C) 2010-2012 Daniele Varrazzo <daniele.varrazzo@gmail.com>
11# All rights reserved.  See COPYING file for details.
12
13
14import eventlet
15eventlet.monkey_patch()
16
17import psycogreen.eventlet
18psycogreen.eventlet.patch_psycopg()
19
20import urllib2  # green
21
22import psycopg2
23
24import logging
25logging.basicConfig(level=logging.INFO, format="%(asctime)s %(message)s")
26logger = logging.getLogger()
27logger.info("testing psycopg2 with eventlet")
28
29conn = psycopg2.connect("dbname=postgres")
30
31def download(num, secs):
32    url = "http://localhost:8000/%d/" % secs
33    for i in range(num):
34        logger.info("download %d start", i)
35        data = urllib2.urlopen(url).read()
36        logger.info("download %d end", i)
37
38def fetch(num, secs):
39    cur = conn.cursor()
40    for i in range(num):
41        logger.info("query %d start", i)
42        cur.execute("select pg_sleep(%s)", (secs,))
43        logger.info("query %d end", i)
44
45logger.info("making jobs")
46pool = eventlet.GreenPool()
47pool.spawn(download, 2, 3),
48pool.spawn(fetch, 3, 2),
49
50logger.info("join begin")
51pool.waitall()
52logger.info("join end")
53
54