Mochi 0.0.9 をPyPIに登録しました。

Mochi 0.0.9PyPI に登録しました。

Mochi 0.0.9 では、シーケンスの各要素を順番に、メッセージとしてアクターに送信する!>演算子と!&>演算子を導入しています。

  • !>演算子は、右辺のアクターに左辺の値をメッセージ送信します。

  • !&>演算子は、左辺にシーケンスをとり、シーケンスの各要素を順番に、右辺の式を評価して得られるアクターにメッセージ送信します。右辺の式はメッセージ送信するたびに評価されます。

!&>演算子を用いた例として、Weather Hacks - livedoor 天気情報から、横浜市と東京都、久留米市の天気を取得して、表示するコードを書いてみました。

Rubyで動くLispのこと - 4276215469」に記載のコードを参考にしています。

(12月25日 コードを一部変更しました)

from eventlet.green.urllib import urlopen
import json

urls = [
    "http://weather.livedoor.com/forecast/webservice/json/v1?city=140010",
    "http://weather.livedoor.com/forecast/webservice/json/v1?city=130010",
    "http://weather.livedoor.com/forecast/webservice/json/v1?city=400040"
]


def show(url):
    weather = urlopen(url).read().decode('utf-8') |> json.loads()
    print(weather['title'])
    map(-> print($1['dateLabel'], $1['telop']),
        weather['forecasts']) |> doall()
    print('')


def fetch():
    receive:
        url: show(url)

urls !&> spawn(fetch)
# 上記は下記と同じ意味です。
# 左辺のシーケンスの要素数分、右辺の式が複数回評価されます。
# spawn(fetch) ! get(urls, 0)
# spawn(fetch) ! get(urls, 1)
# spawn(fetch) ! get(urls, 2)

wait_all()

表示結果は下記のようになります。

東京都 東京 の天気
今日 曇のち晴
明日 晴のち曇
明後日 曇時々雨

福岡県 久留米 の天気
今日 晴れ
明日 曇時々晴
明後日 雨のち曇

神奈川県 横浜 の天気
今日 曇のち晴
明日 晴のち曇
明後日 曇時々雨

各アクターのI/O待ちが並列に行われているため、都市の表示順が固定ではないことに注意してください。天気情報を早く取得できた都市から結果が表示されます。 (Mochi のアクターは Eventlet を用いて実装されています。そのため、並列に実行されるのはI/O部分だけです。)

もし、アクターを用いて並列にではなく、直列に結果を取得表示するのであれば下記のようなコードになります。

from eventlet.green.urllib import urlopen
import json

urls = [
    "http://weather.livedoor.com/forecast/webservice/json/v1?city=140010",
    "http://weather.livedoor.com/forecast/webservice/json/v1?city=130010",
    "http://weather.livedoor.com/forecast/webservice/json/v1?city=400040"
]


def show(url):
    weather = urlopen(url).read().decode('utf-8') |> json.loads()
    print(weather['title'])
    map(-> print($1['dateLabel'], $1['telop']),
        weather['forecasts']) |> doall()
    print('')


def fetch():
    receive:
        url: show(url)
    fetch()

actor = spawn(fetch)
urls !&> actor

wait_all()

結果は、下記のようなります。

神奈川県 横浜 の天気
今日 曇のち晴
明日 晴のち曇
明後日 曇時々雨

東京都 東京 の天気
今日 曇のち晴
明日 晴のち曇
明後日 曇時々雨

福岡県 久留米 の天気
今日 晴れ
明日 曇時々晴
明後日 雨のち曇

この方式の場合、都市の表示順は常に一定となります。

正直、今回の例の場合、並列版は、Mochi のアクターを使わずに Eventlet の spawn を使い、直列版は、普通に順番に関数を実行するスタイルで書いた方がよいかもしれません。アクターの適切な使用例は、また別途、掲載するかもしれません。