용도 - 파이썬에서 액터활용안
초경량및 파이썬을 통한 자동화등 여러가지 목적이 있음 |
파이썬 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 |
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! |
리마인드 차원에서 서로 다른 진영의 액터구현을 살펴보겠습니다.
이 액터는 추후 설정화를 통해 원격으로 배치도 되고 분산처리를 위해 라우터에 배치도 가능한
유연성을 가지게 됩니다.
public class MyActor : ReceiveActor { public MyActor() { Receive<string>(message => { Sender.Tell("RE:" + message); }); Receive<SomeMessage>(message => { Sender.Tell("RE:" + message.message); }); } } |
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 } } |
액터만으로 휼륭한 비동기 처리가 되지만(파이썬에서 액터는 아직 미완성인듯 한 느낌),동기처리 기본 라이브러리 사용법도 익혀둠
따라가니 비동기 처리를위해서 코르틴이란 다소 생소한 방식까지 보게됨