[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