On Sun, Jun 21, 2015 at 5:55 AM, anu sree <[email protected]> wrote:
> Thanks naufal and Krace.
>
> I have tried following code. I have given gevent.sleep(0.1), that means
> each greenlet let others to execute 0.1 secoond. But here each greenlet
> waiting for others to complete, why? Is it because of greenlet.joinall ?
>
Gevent has the hub/scheduler. The whole job is to schedule the tasks. AFAIK,
the hub uses queue to schedule them. If the task has a sleep [1], task is
enqueued for later execution [2].
By saying sleep, gevent puts task out of execution and doesn't guarantee
execution once time is elapsed.
>
> Here I have created 3 greenlet threads (A, B, C). I think, A is the parent
> greenlet, right ? Once C get finished control should goes to B, right ?
> But here it going to A.
> Please check the ouput.
>
> import gevent
>
> def task(num):
> thread_id = id(gevent.getcurrent())
> print "Start: ", num, thread_id
>
> for i in range(100000001):
> if i == 100000000:
> print num + str(i)
>
> gevent.sleep(0.1)
>
> for i in range(100000001):
> if i == 100000000:
> print num + str(i)
>
> print "End: ", num, thread_id
>
> threads = [gevent.spawn(task, x) for x in ['A', 'B', 'C']]
> gevent.joinall(threads)
>
>
> Output
> =======
>
> Start: A 139984038735696
> A100000000
> Start: B 139984008421616
> B100000000
> Start: C 139984008421776
> C100000000
> A100000000
> End: A 139984038735696
> B100000000
> End: B 139984008421616
> C100000000
> End: C 139984008421776
>
Parent in gevent context is Hub(run inside an event loop). Like unix
process concept, gevent doesn't have parent process and child process.
Let's say if a task is spawn inside gevent task, they are still individual
tasks.
In [24]: def task(langs):
print "inside task", gevent.getcurrent(), gevent.getcurrent().parent
def echo(msg):
print msg, gevent.getcurrent(), gevent.getcurrent().parent
tasks = [gevent.spawn(echo, lang) for lang in langs]
gevent.joinall(tasks)
....:
In [25]: gevent.joinall([gevent.spawn(task, langs) for langs in [('Python',
'Go'), ('Lisp', 'Clojure')]])
inside task <Greenlet at 0x1025269b0: task(('Python', 'Go'))> <Hub at
0x1025262d0 select default pending=0 ref=1>
inside task <Greenlet at 0x102526f50: task(('Lisp', 'Clojure'))> <Hub at
0x1025262d0 select default pending=0 ref=2>
Python <Greenlet at 0x102526cd0: echo('Python')> <Hub at 0x1025262d0 select
default pending=0 ref=3>
Go <Greenlet at 0x102526d70: echo('Go')> <Hub at 0x1025262d0 select default
pending=0 ref=3>
Lisp <Greenlet at 0x1025265f0: echo('Lisp')> <Hub at 0x1025262d0 select
default pending=0 ref=3>
Clojure <Greenlet at 0x102526c30: echo('Clojure')> <Hub at 0x1025262d0
select default pending=0 ref=3>
_______________________________________________
> BangPypers mailing list
> [email protected]
> https://mail.python.org/mailman/listinfo/bangpypers
>
[1]: https://github.com/gevent/gevent/blob/master/gevent/hub.py#L80
[2]:
https://github.com/gevent/gevent/blob/1599210203836560698a5facac015c31735cac3d/gevent/corecffi.py#L402
--
*Thanks & Regardskracekumar"Talk is cheap, show me the code" -- Linus
Torvaldshttp://kracekumar.com <http://kracekumar.com>*
_______________________________________________
BangPypers mailing list
[email protected]
https://mail.python.org/mailman/listinfo/bangpypers