[BangPypers] real use case of gevent context switch gevent.sleep(0)
anu sree
anusree.a04 at gmail.com
Sun Jun 21 08:38:19 CEST 2015
Hi Krace,
I am still not understanding from code (practical example) where we are
getting the benefit of PAUSE and let other greenlet to execute.
I have created a simple worker program from your example
https://github.com/dcramer/taskmaster/blob/79a312c5cb3c34d00829fe9cf4204aeb478a0166/src/taskmaster/client.py#L26
.
This code has two pause (gevent.sleep(0)), in Consumer.start and Worker.run.
Here control goes to Worker.run when Consumer.start pauses and
Consumer.start gets control back when Worker.run pauses. There may be
benefit from this switching, but I am still not understanding it.
Please check the attached code and output. Is my example code valid ?
CODE
======
import gevent
class Worker(object):
def __init__(self, consumer, target):
self.consumer = consumer
self.target = target
def run(self):
print "Worker.run, START"
self.started = True
while self.started:
print "Greenlet thread (from Worker.run) Pauses, START"
gevent.sleep(0)
print "Greenlet thread (from Worker.run) Pauses, END"
job = self.consumer.get_job()
self.target(job)
print "Worker.run, END"
class Consumer(object):
def __init__(self, target):
self.target = target
def start(self):
print "Consumer.start, START"
self.started = True
worker = Worker(self, self.target)
gevent.spawn(worker.run)
while self.started:
print "Main Interpreter greenlet (from Consumer.start) Pauses,
START"
gevent.sleep(0)
print "Main Interpreter greenlet (from Consumer.start) Pauses,
END \n"
print "Consumer.start, END"
def get_job(self):
return 10000
#############
def my_target_1(n):
print "my_target_1, START"
nums = []
while n > 0:
nums.append(n)
n -= 1
print "my_target_1, END"
c = Consumer(my_target_1)
c.start()
OUTPUT
=======
Consumer.start, START
Main Interpreter greenlet (from Consumer.start) Pauses, START
Worker.run, START
Greenlet thread (from Worker.run) Pauses, START
Main Interpreter greenlet (from Consumer.start) Pauses, END
Main Interpreter greenlet (from Consumer.start) Pauses, START
Greenlet thread (from Worker.run) Pauses, END
my_target_1, START
my_target_1, END
Greenlet thread (from Worker.run) Pauses, START
Main Interpreter greenlet (from Consumer.start) Pauses, END
Main Interpreter greenlet (from Consumer.start) Pauses, START
Greenlet thread (from Worker.run) Pauses, END
my_target_1, START
my_target_1, END
Greenlet thread (from Worker.run) Pauses, START
Main Interpreter greenlet (from Consumer.start) Pauses, END
More information about the BangPypers
mailing list