일반적으로 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 드라이버를 사용하는 것이 합리적입니까?
감사 :
나는 PyOhio에서 지난해 모모코, Aiopg 및 GEvent에 대한 이야기를했다! 모든 파이썬 비동기 RDBMS 드라이버/ORM은 그다지 신뢰할 수 없다는 것을 읽었습니다. 사람들은 'ORM을 만드는 것은 어렵다. 제대로 할 수 없다'고 말하고있다. 또한 비동기 DB 액세스를 사용할 때 concurency는 어떻습니까? – lime
asyncio + Tornado를 사용하는 목적은 무엇입니까? 그들은 둘 다 IOLoops를 가지고 있는데 왜 기본 토네이도를 사용하지 않을까요? 웹이 아닌 물건 일지라도 토네이도의 루프는 같은 매너에서 성공적으로 사용될 수 있습니다. – lime
1. 지금까지 신뢰성 등, 아직 문제가 없었어요,하지만 그건 문제가 아니라는 것을 것은 아니다. 동기화 된 것보다 비동기적인 것보다 훨씬 적은 사람들이 눈이 적기 때문에 더 많은 이슈를 기대합니다. 2. 나는 ORM이 어렵다는 데 동의한다. ActiveRecord 구현을 기반으로 한 ORM이 싫습니다. 필자는 Postgres 만 사용하기 때문에 하나의 파일 orm을 만들었습니다.이 파일은 객체와 관계 매핑을 수행하며 다른 것들은 사용하지 않습니다. 3. 동시성은 async에서 문제가 될 수 있습니다. 적어도 비동기를 켜면 postgres에서 사용할 수없고 자동 txn을 사용할 수 없습니다. begin과 commit을 호출해야합니다. –