용도 - 파이썬에서 액터활용안

  • 스레드 생성코드 작성하지 않고, 동시성 비동기 프로그래밍 지원
  • 파이썬간 원격 메시지 처리를 위해
  • 기존 액터개발 패턴을 활용함으로 언어변경간 갭을 줄임


초경량및 파이썬을 통한 자동화등 여러가지 목적이 있음


 파이썬 3.5이상에서 기본 지원하는 Async(coroutines) 모델 ,C#의 Async Task와 크게 다를바 없으며

액터모델 은 이러한것을 더 단순화하고 추상화하는게 목적입니다. 서비스가 복잡해지면 콜백헬에 빠질수 있기때문입니다.

단순하게 인메모리에서 스크립트 사용이라면 이것만으로 충분할것으로 생각됩니다.


import asyncio
from thespian.actors import *
import time


class EngActor(Actor):
    def __init__(self):        
        self.greeting='hi there'    

    def receiveMessage(self, message, sender):
        print(self.greeting)
        self.send(sender, self.greeting )

class KorActor(Actor):
    def __init__(self):        
        self.greeting='안녕하시오'    
            
    def receiveMessage(self, message, sender):
        time.sleep(1);
        print(self.greeting)
        self.send(sender, self.greeting )

class HelloAsync:
    def __init__(self):
        self.greeting = "hi there2"

    async def SayHello(self,message):
        await asyncio.sleep(1)
        print(self.greeting)        
    
#액터방식
def say_hello():    
    actorSys = ActorSystem()
    engActor = actorSys.createActor( EngActor )
    korActor = actorSys.createActor( KorActor )
    actorSys.tell(korActor, '이보시오~')
    actorSys.tell(engActor, 'are you there?')    

say_hello();


#코르틴 방식
async def asay_hello():
    asyncHello = HelloAsync()
    await asyncHello.SayHello('are you there?')

loop = asyncio.get_event_loop()
loop.run_until_complete(asay_hello())
loop.close()


print('============= wait for test ==================')
time.sleep(3);

## Result - 순차적으로 처리된듯 하나~ 동시적으로 처리됨
# 안녕하시오
# hi there




pykka
import pykka
import time


class Greeter(pykka.ThreadingActor):
    def __init__(self, greeting='Hi there!'):
        super(Greeter, self).__init__()
        self.greeting = greeting
    def on_receive(self, message):
        if self.greeting=='Hi you!':   #영어 인사는 늦게 응답한다.
            time.sleep(0.5);

        print(self.greeting)
        return "OK"


# 미국인 액터와, 한국인 액터를 만든다.
actor_ref = Greeter.start(greeting='Hi you!')
actor_kor_ref = Greeter.start(greeting='안녕하세요')


# 각각에게 인사를 한다.  -결과를 기다리는 순차처리
answer = actor_ref.ask({'msg': 'Hi?'}, timeout=3)
answer = actor_kor_ref.ask({'msg': '안녕?'}, timeout=3)


# 동시에 인사를한다. -동시성처리 (한글인사가 더 빠르게 처리됨)
actor_ref.tell({'msg': 'Hi?'} )
actor_kor_ref.tell({'msg': '안녕?'} )

print('============= wait for test ==================')
time.sleep(1.5);

## Result
#안녕하세요
#Hi you!



다른언어에서의 액터

리마인드 차원에서 서로 다른 진영의 액터구현을 살펴보겠습니다.

이 액터는 추후 설정화를 통해 원격으로 배치도 되고 분산처리를 위해 라우터에 배치도 가능한 

유연성을 가지게 됩니다. 

C#에서의 액터

public class MyActor : ReceiveActor
{       
 
    public MyActor()
    {
        Receive<string>(message => {
            Sender.Tell("RE:" + message);               
        });
 
        Receive<SomeMessage>(message => {
            Sender.Tell("RE:" + message.message);
        });
    }
}


Scala/Java 진영의 액터

class Greeter extends Actor {

  var greeting = "default"

  def receive = {

    case WhoToGreet(who) => greeting = s"hello, $who"

    case Greet           => sender ! Greeting(greeting) // Send the current greeting back to the sender
  }
}



 액터만으로 휼륭한 비동기 처리가 되지만(파이썬에서 액터는 아직 미완성인듯 한 느낌),동기처리 기본 라이브러리 사용법도 익혀둠

따라가니 비동기 처리를위해서 코르틴이란 다소 생소한 방식까지 보게됨 


  • No labels