개발 업무를 몇년째 하고 있는데, 일부 개발자분들이 thread를 new Thread().start() 와 같이 단편적인 worker로만 사용하는 경우가 많이 있고, 백그라운드로 동작시키면서 queue 처리가 필요한 작업을 하려고 할때 thread pool을 만들고 pool size를 1로 해서 구현하는 경우가 있는가 하면, 내부에 lock, unlock, semaphore, flag 등을 동원하여 쓰레드를 제어하는 경우도 있다.


쓰레드는 잘 쓰면 참 좋은 도구이지만, 잘못 쓰면 디버깅도 힘들고 이슈가 발생하여도 재현도 잘 되지 않으며, 그리고 결정적으로 고치기는 매우 힘들다.


나는 플래그 사용하는 것도 싫어하고, 멤버 변수에 thread 변수를 생성하여 if thread가 생성되었나? 되었으면 blocking list에 insert 하는 구조도 좋아하지 않는다.


최근 업무로 구조를 새로 잡는 프로젝트가 있는데, 진짜 지옥 of 지옥이다.


개인적으로정리도 해둘겸해서 백그라운드 작업용도로 사용할 쓰레드를 Handler, Looper와 함께 사용하는 방법으로 정리해둔다.


두가지 방법이 있는데, 첫번째는 안드로이드의 Thread와 Handler 그리고 Looper를 직접 사용하는 방법이다.



Thread 를 상속받아 run 내부에 Looper 와 hanlder를 직접 사용하여 queued 백그라운드 처리를 할수 있다.


작업을 요청할때는 아래와 같이 요청하면 된다.



Hander에 메시지를 보내는것으로 작업요청은 끝이고, Handler에 의해서 작업요청이 queue에 의해서 하나씩 순차적으로 처리가된다.


데이터 정합성을 보장해야하는 경우 요청이 들어오는 순서대로 처리를 해야 정합성을 그마나 보장할수 있다. (반드시 해당 쓰레드 한군데에서만 데이터 베이스에 접속을 하는것도 빠지면 안된다.)



두번째 방법은 위와 같은 구현을 Android에서 제공하는 것이 있는데, 바로 HandlerThread이다.



작업을 요청하는 방법은 첫번째 방법과 다르지 않다.



Thread 관리를 위해서 별도로 구현한 ThreadMonitor와 ClosableThread인터페이스가 있는데, Looper.loop() 통한 무한루프를 가지고 있는 쓰레드이기 때문에 때문에 작업이 모두 끝나면 getLooper.quit() 등으로 looper를 종료시켜주어야 한다.


위에서 request시  thread 의 state를 관리하여 CountdDownLatch로 동시성 제어를 하는 이유는, 쓰레드가 생성되고 running 상태가 되고나서야 Handler를 통해서 메시지를 보내기 위해서이다.


실행결과는 다음과 같이 요청에 대해서 순차적으로 처리가 된다.



쓰레드 id를 보면 첫번째 구현으로 만든 SimpleThread는 32164 이고, 두번째 구현으로 만든 SimpleHandlerThread는 32163 이다.


이 둘의 쓰레드를 각각 모니터링하여 작업이 모두 끝나면 쓰레드를 종료시켜주기 위한 ThreadMonitor를 각각 생성하여 추가하였는데, 작업이 끝날때마다 onProcessed 를 전달받아 작업 요청사항들을 관리하고 종료가되면 쓰레드들을 종료시키는 기능을 한다.


플래그 사용하는 것을 싫어하기 때문에 사용하는 방법이기 때문에 아래 첨부한 소스를 참고하여 다른 방법으로 응용하여 사용하여도 좋을듯하다.


ClosableThread.java

MainActivity.java

Monitor.java

SimpleHandlerThread.java

SimpleThread.java

ThreadMonitor.java



블로그 이미지

rekun,ekun 커뉴

이 세상에서 꿈 이상으로 확실한 것을, 인간은 가지고 있는 것일까?

오늘 아침 눈뜨자 마자 갑자기 코딩이 하고 싶어서 일요일인데도 불구하고 6시 10분에 눈이 번쩍 하고 떠졌다.


꿈을 꾼것인지, 뭔지 ... 


어제는 계속 낚시하는 공부만 하다가 잤는데, 눈뜨자마자 그간 미뤄왔던 안드로이드 앱 수정과 그에 맞는 웹호스팅중인 php 코드도 좀 수정을 해야 겠다 마음을 먹고 바로 컴퓨터를 켰다.


오전내내 만들고 수정한것은 사람들이 대체 무엇을 검색하고 왜 검색하는지 다음,네이버 등을 들어가서 일일이 클릭해서 보는게 귀찮아서 내가 보고 싶을때, 사람들이 많이 본 검색어와 뉴스들을 한방에 긁어오는 웹앱을 만들었다. 근데 웹앱으로 만들어두니까, 가독성도 떨어지고, 나중에 저장해뒀다가 보는것이 불편해서 아예 이슈만 저장하는 블로그를 하나 팠다.


한번씩 긁 읽어볼 필요가 있을때, 즐겨찾기 해둔 웹앱을 실행해서 긁어다가 블로그에 넣고 앉아서 클릭 또는 넣어놓고 출퇴근중에 하나씩 보면 꿀같은 휴식을 취할수가 있다.


이런 웹앱 만드는것은 너무나 간단해서 아주 아주 오래전에 만들어뒀던 php 코드를 살짝 수정해서 완성했다.

처음에는 물론 버그가 있어서, 제일처음 글 올린것은 링크가 다 ....깨졌다.


오늘 자기전에 긁어서 저장해놨다가 내일 출근할때 봐야지.


이런 웹앱을 만드는데는 다른 것을 많이 사용하는 것보다 php로 curlsimplehtmldom 라이브러리만 있으면 만들수 있다.


예제 코드를 하나 올려보면 아래와 같이 함수로 하나 만들어두면 글을 긁어올수 있고, simplehtmldom을 사용하여 요소별로 분리할수 있다.





이것을 하고 나니, 오후가 되었는데, 왠지 오늘 코딩빨이 좀 받는 느낌이 들어서, 그간 귀찮아서 미뤄두었던 kpop app 의 업데이트를 위한 서버 작업, 앱 수정 배포도 했다.




생각보다 많은 외국인들이 사용해주고 메일도 주고 해서 업데이트를 빨리 해야지 하고 있었는데, 지난 몇년간 시달림이 있다보니, 이런 여유시간도 많이 없었고, 여유시간에 코딩을 한다는 것 자체가 정말 오랫만이되어버려서 2년인가 4년 만에 코딩을 다시 한 느낌이 든다.


지금 업데이트 올려보니, 그간 구글에서 많은 정책이 바뀌어서 그것 하나 하나 맞춰주느라.. 진땀 뺐다.


그리고 그간 사용하던 도메인하고, 웹호스팅도 다음달부로 만료된다고 해서 그것들도 다 연장하고 결재하고나니 일요일이 휘리릭 다갔네~


그래도 뭔가 그간 화장실 가고 싶은데 못갔던 느낌으로 몇년간 지내다가 이참에 정리해버리니 뭔가 정리된 느낌도 들고, 이제 앱 리뷰 오는거랑 해서 잘 업데이트 하면서 관리좀 해야지~~ 하며 마음을 다 잡았다.



블로그 이미지

rekun,ekun 커뉴

이 세상에서 꿈 이상으로 확실한 것을, 인간은 가지고 있는 것일까?

솔직히 이 개발자에게는 모니터를 3개는 줘야 될듯.


코딩하는 것 보니까... 근데 나하고는 스타일이 많이 다르다. 


나는 편의위주의 코딩환경인데, 좀 열악한... ㅠ.ㅠ


모니터 3개는 줘라 좀... 하나는 작업된 결과를 늘 띄워놓는 용도, 하나는 코드만 보는 용도, 하나는 중간 중간 검색하고 다른 툴을 사용하는 화면.


개발자들이 보면 이해할 법한 영상이군...



'코딩하고' 카테고리의 다른 글

프로그래밍을 업으로 하고 있는 사람으로서 ...  (0) 2017.07.16
블로그 이미지

rekun,ekun 커뉴

이 세상에서 꿈 이상으로 확실한 것을, 인간은 가지고 있는 것일까?

머신 러닝 공부하는 재미에, 일찍 퇴근.!!!


새로운걸 알아가는 그 과정은 너무나 즐겁다. 그 끝이 무엇인지는 몰라도~~



'코딩하고 > Python' 카테고리의 다른 글

머신 러닝, 파이썬  (0) 2017.07.06
python으로 딥러닝 시작하기!!!  (0) 2017.07.04
블로그 이미지

rekun,ekun 커뉴

이 세상에서 꿈 이상으로 확실한 것을, 인간은 가지고 있는 것일까?

알파고 나올때는 뭐 저런거는 엄청난 슈퍼 컴퓨터나 있어야 해볼만 한거지, 뭐 개인으로서 저런거를 해볼수나 있겠어??


그러다가 최근 사내에서 진행되는 머신러닝 및 딥러닝을 이용한 솔루션을 진행하는 것은보니, 그냥 집에서 혼자 공부해서 해도 잘할수 있을것 같아서 늦은 것 같지만 공부를 시작했다.


일단 python은 프로그래밍이라기 보다는 컴퓨터와 편지를 주고 받는다는 느낌으로 글을 쓰는 느낌의 "언어"니까 아무런 어려움이 없고, 찾아보니 python으로 이미 많은 머신러닝용 라이브러리들이 천지에 널려있다.

(진짜 이제 개발자로 밥먹고 살기 점점 힘들어질것 같다....뭘 개발할 필요가 없어짐,,,, 누가 벌써 다 만들어놓음...)


느긋하게 영상으로 이제 공부를 해봐야지.



'코딩하고 > Python' 카테고리의 다른 글

머신 러닝, 파이썬  (0) 2017.07.06
python으로 딥러닝 시작하기!!!  (0) 2017.07.04
블로그 이미지

rekun,ekun 커뉴

이 세상에서 꿈 이상으로 확실한 것을, 인간은 가지고 있는 것일까?