Geventの良さ3

Scapyに移りたかったんですけど、さすがに中途半端すぎるので、
Geventの良さ1が始まってから、2日ぐらいしか経ってないので、一週間は頑張ろうと思います。

#multiprocessing
def queue_func(queue):
    for i in range(30):
        time.sleep(0.5 * random.random())
        queue.put(i*i)
    queue.put('STOP')

def test_queue():
    q = multiprocessing.Queue()

    p = multiprocessing.Process(target=queue_func, args=(q,))
    p.start()

    o = None
    while o != 'STOP':
        try:
            o = q.get(timeout=0.3)
            print(o, end=' ')
            sys.stdout.flush()
        except Empty:
            print('TIMEOUT')

    print()

また師匠に質問したのがですね、

>Queueを引数にするのがよくわからないです
Pipeは引数でイメージが考えやすいんですが…
もしかしてですけど、
i*iっていう計算をすべて並列でやってるってことですか?
それだと、プロセス間の通信っていう概念ではなくなりますし///


ッて感じです。
僕のそもそもの「プロセス間通信」っていう考え方が間違ってるかもしれないですね。
僕が思ってるのはManagerがやることかもしれない。
かもしれない。

#gevent

import gevent
from gevent.queue import Queue

tasks = Queue()

def worker(n):
    while not tasks.empty():
        task = tasks.get()
        print('Worker %s got task %s' % (n, task))
        gevent.sleep(0)

    print('Quitting time!')

def boss():
    for i in xrange(1,25):
        tasks.put_nowait(i)

gevent.spawn(boss).join()

gevent.joinall([
    gevent.spawn(worker, 'steve'),
    gevent.spawn(worker, 'john'),
    gevent.spawn(worker, 'nancy'),
])

ソースの内容は違いますが、なんとなく違いがわかりますねー。

multiprocessingは Queueオブジェクト自体がアイテム、引数として並列らしき関数に渡されて、
そこでputなりgetなりされてますね。
一方、Geventはそれ自体を動かしてるって感じしますね。

って書いてて思ったんですが、ソースの書き方によっては別に同じような書き方ができるんじゃないかと思いました。

あと、ここにかかれてる gevent.sleep(0)の存在意義がわからなかったので、
師匠に聴いてみました。