용도 - 파이썬에서 액터활용안
- 스레드 생성코드 작성하지 않고, 동시성 비동기 프로그래밍 지원
- 파이썬간 원격 메시지 처리를 위해
- 기존 액터개발 패턴을 활용함으로 언어변경간 갭을 줄임
초경량및 파이썬을 통한 자동화등 여러가지 목적이 있음
파이썬 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 } }
액터만으로 휼륭한 비동기 처리가 되지만(파이썬에서 액터는 아직 미완성인듯 한 느낌),동기처리 기본 라이브러리 사용법도 익혀둠
따라가니 비동기 처리를위해서 코르틴이란 다소 생소한 방식까지 보게됨
- https://docs.python.org/3/library/asyncio-task.html
- https://godaddy.github.io/Thespian/doc/blog/async_blog_2016Feb/async_2016Feb.html (이건 async vs actor 비교)