Created
February 14, 2013 18:43
-
-
Save jrdmcgr/4955159 to your computer and use it in GitHub Desktop.
http://stackoverflow.com/questions/9247641/throughput-differences-when-using-coroutines-vs-threading
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/usr/bin/env python | |
concurrency_impl = 'gevent' # single process, single thread | |
##concurrency_impl = 'threading' # single process, multiple threads | |
##concurrency_impl = 'multiprocessing' # multiple processes | |
if concurrency_impl == 'gevent': | |
import gevent.monkey; gevent.monkey.patch_all() | |
import logging | |
import time | |
import random | |
from itertools import count, islice | |
info = logging.info | |
if concurrency_impl in ['gevent', 'threading']: | |
from Queue import Queue as JoinableQueue | |
from threading import Thread | |
if concurrency_impl == 'multiprocessing': | |
from multiprocessing import Process as Thread, JoinableQueue | |
def do_work(wid, value): | |
time.sleep(random.randint(0,2)) | |
info("%d Task %s done" % (wid, value)) | |
def worker(wid, q): | |
while True: | |
item = q.get() | |
try: | |
info("%d Got item %s" % (wid, item)) | |
do_work(wid, item) | |
finally: | |
q.task_done() | |
info("%d Done item %s" % (wid, item)) | |
def producer(pid, q): | |
for item in iter(lambda: random.randint(1, 11), 10): | |
time.sleep(.1) # simulate a green blocking call that yields control | |
info("%d Added item %s" % (pid, item)) | |
q.put(item) | |
info("%d Signal Received" % (pid,)) | |
def main(): | |
logging.basicConfig(level=logging.INFO, | |
format="%(asctime)s %(process)d %(message)s") | |
q = JoinableQueue() | |
it = count(1) | |
producers = [Thread(target=producer, args=(i, q)) for i in islice(it, 2)] | |
workers = [Thread(target=worker, args=(i, q)) for i in islice(it, 4)] | |
for t in producers+workers: | |
t.daemon = True | |
t.start() | |
for t in producers: t.join() # put items in the queue | |
q.join() # wait while it is empty | |
# exit main thread (daemon workers die at this point) | |
if __name__=="__main__": | |
main() |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment