2016-07-13 4 views
0

일반적으로 RDBMS 드라이버가 차단된다. 이로 인해 SQL 쿼리가 끝날 때까지 IOLoop이 차단되므로 CRUD 작업을 수행 할 때 비동기가 비합리적으로 사용됩니다.토네이도 RDBMS 통합

(ACID 때문에) DB로 RDBMS를 사용하는 프로젝트에서 일하고 있지만 웹 기반의 기능적인 기능 (예 : 푸시 알림)을 조정해야하며 일부 인터넷 검색 후에 Tornado를 사용하려고 생각하고 있습니다. 일반적인 REST와 웹 소켓은 하나의 앱에서 구현 될 수 있습니다.

내가 (: https://gist.github.com/methane/2185380 여기) :이 조각을 볼 수있는 웹 브라우징

import time 

from tornado.concurrent import run_on_executor 
from concurrent.futures import ThreadPoolExecutor # `pip install futures` for python2 

MAX_WORKERS = 4 


class Handler(tornado.web.RequestHandler): 
    executor = ThreadPoolExecutor(max_workers=MAX_WORKERS) 

    @run_on_executor 
    def background_task(self, i): 
     """ This will be executed in `executor` pool. """ 
     time.sleep(10) 
     return i 

    @tornado.gen.coroutine 
    def get(self, idx): 
     """ Request that asynchronously calls background task. """ 
     res = yield self.background_task(idx) 
     self.write(res) 

은 무엇 그것은 기본적 않는 것은 별도의 스레드에 대한 CRUD 작업을 푸시합니다. 내 질문은 :이 비동기 HTTP 서버를 사용하는 경우 RDBMS 드라이버를 차단 처리의 기본 접근 방식인가? 차단 병목을 최소화하는 다른 방법이 있습니까? 비동기 서버와 함께 블로킹 RDBMS 드라이버를 사용하는 것이 합리적입니까?

답변

1

토네이도의 RDBMS를 다루는 여러 가지 방법이 있습니다.

토네이도에 비동기을 수행하기위한 다양한 DB의의에 대한 몇 가지 라이브러리가 있습니다. https://github.com/tornadoweb/tornado/wiki/Links

GEvent를 사용하여 토네이도에서 비동기적인 db 액세스를 얻을 수도 있습니다. 다른 옵션을 언급 한 바와 같이 https://aiopg.readthedocs.io/en/stable/

다른 곳 DB 작업 부하를 오프로드하는 것입니다

또 다른 옵션은 같은 토네이도와 라이브러리 IO Python3 비동기를 사용하는 것입니다. ZeroMQ 또는 RabbitMQ와 같은 메시지 대기열, 여러 스레드, 여러 프로세스, 다른 상자의 API를 사용할 수 있습니다.

또한, 그들은 여전히 ​​그들이 돌아올 때까지 그들은 단지 블록, 토네이도에서 작동 표준 차단 데이터베이스 액세스 메커니즘을 사용할 수 있습니다,이 문제가 될 수도 있고 그렇지 않을 수도 있습니다. http://pyvideo.org/video/3698/from-synchronous-to-asynchronous-postgres-with-to

+0

감사 :

나는 PyOhio에서 지난해 모모코, Aiopg 및 GEvent에 대한 이야기를했다! 모든 파이썬 비동기 RDBMS 드라이버/ORM은 그다지 신뢰할 수 없다는 것을 읽었습니다. 사람들은 'ORM을 만드는 것은 어렵다. 제대로 할 수 없다'고 말하고있다. 또한 비동기 DB 액세스를 사용할 때 concurency는 어떻습니까? – lime

+0

asyncio + Tornado를 사용하는 목적은 무엇입니까? 그들은 둘 다 IOLoops를 가지고 있는데 왜 기본 토네이도를 사용하지 않을까요? 웹이 아닌 물건 일지라도 토네이도의 루프는 같은 매너에서 성공적으로 사용될 수 있습니다. – lime

+0

1. 지금까지 신뢰성 등, 아직 문제가 없었어요,하지만 그건 문제가 아니라는 것을 것은 아니다. 동기화 된 것보다 비동기적인 것보다 훨씬 적은 사람들이 눈이 적기 때문에 더 많은 이슈를 기대합니다. 2. 나는 ORM이 어렵다는 데 동의한다. ActiveRecord 구현을 기반으로 한 ORM이 싫습니다. 필자는 Postgres 만 사용하기 때문에 하나의 파일 orm을 만들었습니다.이 파일은 객체와 관계 매핑을 수행하며 다른 것들은 사용하지 않습니다. 3. 동시성은 async에서 문제가 될 수 있습니다. 적어도 비동기를 켜면 postgres에서 사용할 수없고 자동 txn을 사용할 수 없습니다. begin과 commit을 호출해야합니다. –