jodal / pykka

🌀 Pykka makes it easier to build concurrent Python applications.

Home Page:https://pykka.readthedocs.io

Geek Repo:Geek Repo

Github PK Tool:Github PK Tool

Gevent can't work

wylyeak opened this issue · comments

class GeventPrintActor(GeventActor):
    def print_text(self, message):
        print message
        self.stop()


class ThreadingPrintActor(pykka.ThreadingActor):
    def print_text(self, message):
        print message
        self.stop()


GeventPrintActor.start().proxy().print_text("GeventPrintActor")
ThreadingPrintActor.start().proxy().print_text("ThreadingPrintActor")

Can't see GeventPrintActor in console

I'm a bit rusty on gevent, but I'm guessing that the print statement does some I/O that is lost unless you use gevent's monkey patching to gevent-enable print.

The following example works:

import gevent.monkey
gevent.monkey.patch_all()

import pykka
import pykka.gevent


class GeventPrintActor(pykka.gevent.GeventActor):
    def print_text(self, message):
        print message
        self.stop()


class ThreadingPrintActor(pykka.ThreadingActor):
    def print_text(self, message):
        print message
        self.stop()


GeventPrintActor.start().proxy().print_text('GeventPrintActor')
ThreadingPrintActor.start().proxy().print_text('ThreadingPrintActor')

If you don't do any I/O, GeventActor works without monkey patching anything:

import pykka
import pykka.gevent


class GeventPrintActor(pykka.gevent.GeventActor):
    def get_text(self):
        return 'GeventText'


class ThreadingPrintActor(pykka.ThreadingActor):
    def get_text(self):
        return 'ThreadingText'


gevent_proxy = GeventPrintActor.start().proxy()
threading_proxy = ThreadingPrintActor.start().proxy()

gevent_future = gevent_proxy.get_text()
threading_future = threading_proxy.get_text()

print gevent_future.get()
print threading_future.get()

gevent_proxy.stop()
threading_proxy.stop()