Skip to content

Tut2 Example2

Sung-June, Lim edited this page Oct 5, 2016 · 3 revisions

File Composition for Tutorial1

_tutorials

_tutorial2

example2

apps

Advanced_AsyncCall.py

blocks

MainWindow.py
P1.py
P2.py
P3.py

cyapp.py
cyapp_cfg.py
cymgr.py
cymgr_cfg.py
cycoord.py
cycoord_cfg.py

Introduction

Flow Stream

===

Asynchronous Programming

Application Specification

Advanced_AsyncCall.py

  • t(title) : Application Title은 'Advanced Async Call : Mean, Standard Deviation'으로 사용
  • B(Block) : 'MainWindow'의 별칭을 'main'으로, 'P1', 'P2', 'P3'의 별칭을 각각 'p1', 'p2, 'p3'으로 사용
  • C(Connectivity) : -
  • D(Data) : -
  • R(Reference) :
    'main'에서 'p1'을 reference 'a'로 사용
    'p1'에서 'p2'를 reference 'a'로 사용
    'p1'에서 'p3'를 reference 'b'로 사용
  • S(Slot) : -
def app_spec():
    t = 'Advanced Async Call : Mean, Standard Deviation'
    B = [('main', 'MainWindow', [], {}),
         ('p1', 'P1', [], {}),
         ('p2', 'P2', [], {}),
         ('p3', 'P3', [], {}),
    ]

    C = []

    D = dict(
        note=dict()
    )

    R = [
        ('main', 'a', 'p1'),
        ('p1', 'a', 'p2'),
        ('p1', 'b', 'p3'),
    ]
    S = [
    ]
    return t, B, C, D, R, S

Block Implementation

MainWindow.py (Main Block)

  • 모든 Block Class는 metaclass로 Block_meta를 사용
from PyQt5 import QtCore, QtWidgets
from PyQt5.QtWidgets import QPushButton

from _qapp import create_task

from cyhub.block import Block_meta


class MainWindow(QtWidgets.QWidget, metaclass=Block_meta):

    def __init__(self):
        super().__init__()
        layout = QtWidgets.QVBoxLayout()
        self.setLayout(layout)
        layout.addWidget(QPushButton('Calculate Mean && Standard Deviation (10, 8, 11, 6, 5, 12, 7)', clicked=self.on_calculate))

    def initialize(self):
        self.show()

    @QtCore.pyqtSlot()
    def on_calculate(self):
        print('Button Clicked.')
        async def _do():
            val_mean, val_std = await self.a.calc_M_STD([10, 8, 11, 6, 5, 12, 7])
            print('Calculated.')

            return val_mean, val_std

        create_task(_do()).then(lambda result: print('Mean : %f\nStandard Deviation : %f\n' % result))
        print('Calculating...')

P1.py (Block)

  • 모든 Block Class는 metaclass로 Block_meta를 사용
from PyQt5 import QtCore

from cyhub.block import Block_meta, cyhub_method


class P1(QtCore.QObject, metaclass=Block_meta):
    
    @cyhub_method
    async def calc_M_STD(self, values):
        val_mean = await self.b.mean(values)
        val_std = await self.a.standard_deviation(values, val_mean)
        return val_mean, val_std

P2.py (Block)

  • 모든 Block Class는 metaclass로 Block_meta를 사용
from PyQt5 import QtCore

from cyhub.block import Block_meta, cyhub_method

import math


class P2(QtCore.QObject, metaclass=Block_meta):
    
    @cyhub_method
    def standard_deviation(self, values, mean):

        val_sum = 0

        for v in values:
            x = v - mean
            x = x*x
            val_sum += x

        val_std = val_sum / len(values)
        val_std = math.sqrt(val_std)

        return val_std

P3.py (Block)

  • 모든 Block Class는 metaclass로 Block_meta를 사용
from PyQt5 import QtCore

from cyhub.block import Block_meta, cyhub_method

import time


class P3(QtCore.QObject, metaclass=Block_meta):

    @cyhub_method
    def mean(self, values):

        val_sum = 0

        for v in values:
            val_sum += v

        val_mean = val_sum / len(values)
        time.sleep(3)

        return val_mean

How to run a Cloud-App

본 예제를 가장 잘 이해 하기 위해서는 4대의 Machine 환경이 필요합니다. 각각의 Machine에서 Coordinator, Manager1, Manager2, Application을 실행 할 것입니다. 따라서, 4대의 Machine 환경에서 실행 가능하도록 환경이 구축되어 있어야 합니다. (하지만, 편의상 Tutorial 시연을 위해 하나의 Machine에서 Coordinator, Manager1, Manager2, Application 모두 실행 가능)

이전 Example에서 작성한 cycoord_cfg.py, cymgr_cfg.py, cyapp_cfg.py 파일에서 cycode_prefix의 값을 example2의 위치로 변경하면 됩니다.

cycoord_cfg.py / cymgr_cfg.py / cyapp_cfg.py
cycode_prefix = '_tutorials._tutorial2.example2'

App 실행

  • Coordinator가 위치한 machine에서 cycoord.py 파일을 실행 합니다.
  • Manager1이 위치한 machine에서 cymgr.py 파일을 실행합니다.
  • Manager2이 위치한 machine에서 cymgr.py 파일을 실행합니다.
  • Application이 위치한 machine에서 cyapp.py 파일을 실행 합니다.
[Application]

[Application Console]

[Coordinator]

[Manager1]

[Manager2]

Clone this wiki locally