run python code with rezina — regina 1 documentation

# run python code with rezina

## Start master and workers

### In single machine

start master with

`rezina-cli runmaster -D`

start worker with

`rezina-cli runworker -D`

### Multi-machines

start master with

`rezina-cli runmaster -H master_ip -D`

start worker with

`rezina-cli runworker -H master_ip -WIP worker1_ip -D`

`rezina-cli runworker -H master_ip -WIP worker2_ip -D`

## Write python code and put it in workspace

`cd ~/rezina/workspace`

`touch cityweather.py`

sourc code:

    #!/usr/bin/evn python

    import urllib2
    import urllib
    import json

    def get_cities():
        cities = ['Beijing', 'Berlin', 'New York', 'London', 'Tokyo', 'Paris',
                  'Chicago', 'washington', 'Venice', 'Houston']
        return cities

    # get city weather data from yahoo weather api
    def get_city_weather(city):
        baseurl = "https://query.yahooapis.com/v1/public/yql?"
        yql_query = "select item.condition.text from weather.forecast \
                     where woeid in (select woeid from geo.places(1) \
                     where text='%s')" % (city)
        yql_url = baseurl + urllib.urlencode({'q': yql_query}) + "&format=json"
        result = urllib2.urlopen(yql_url).read()
        data = json.loads(result)
        # because resule from yahoo api does not include the city name, we add it.
        data['city'] = city
        return data

    # process diffrent output and convert data to a simple format
    def one_word_conditions_for_city(city_weather_result):
        simple_format_data = {}
        simple_format_data['city'] = city_weather_result['city']
        if city_weather_result['query']['results'] is not None:
            weather = city_weather_result['query']['results']['channel']['item']['condition']['text']
        else:
            weather = "Unkonw"  # simplely set unkonw when result is not avaliable
        simple_format_data['weather'] = weather
        return simple_format_data

    if __name__ == "__main__":
        for city in get_cities():
            print one_word_conditions_for_city(get_city_weather(city))

## Write typology to run this code in parallel

`cd ~/rezina/workspace`

`touch weathertypo.py`

source code

    #!/usr/bin/env python
    # -*- coding: utf-8 -*-

    from rezina.utils.network import get_ip
    from rezina import TypologyBuilder
    from rezina.backends import Stdout

    from cityweather import get_cities, get_city_weather, one_word_conditions_for_city

    ip = get_ip() # change to your master_ip
    tb = TypologyBuilder(ip, 12345, 'weather_typo')
    tb.add_hydrant(get_cities).add_notch(get_city_weather, 1, 10)
    tb.add_notch(one_word_conditions_for_city, 1, 1)
    tb.add_bocca(Stdout, persistent_mode='stream')

    if __name__ == "__main__":
        tb.restart(interval=10)

note: replace `ip = get_ip()` to `ip = your_master_ip` if master_ip is given when start master.

## Run code with rezina

run code with

`python weathertypo.py`

note: it will run the code but not immediately, it will run like this, presume the time your run the script is `2016-12-03 20:18:03`, the first time run is at `2016-12-03 20:18:10` and the second run is at `2016-12-03 20:18:20` and next.

if you want run it immediately, use start_time like this:

`tb.restart(start_time="2016-12-03 20:18:03", interval=10")`

the first run will be at `2016-12-03 20:18:03` and the second is at `2016-12-03 20:18:13`

see periodically schedule

Press `ctrl-c` to stop.

## manage typology

you could use console or web console to manage typolog, include start, stop restart remove, launch more process for one task.

`rezina-cli runconsole -H master_ip`

access http://master_ip:31218 in broswer.