[#] Синхронный код в асинхронном Twisted, или сказ о том, как скрестить ежа с ужом
habrabot(difrex,1) — All
2015-12-18 18:00:04




##### Всё хорошо

[Twisted][1] — асинхронный (событийно-ориентированный) фреймворк, написанный на Python. Мощное средство для быстрой разработки сетевых (и не только) сервисов. Он разработан с использованием паттерна проектирования [Reactor][2]. Сервисы созданные с использованием Twisted быстры и надежны, фреймворк позволяет не писать макаронный код, насыщенный непонятными коллбэками, имеет внутри себя красивые хелперы (Deferred, Transport, Protocol etc). Другими словами, делает нашу жизнь бекенд разработчиков лучше.

##### Но есть и проблемы

Основная проблема в том, что многочисленные, надежные, оттестированные, удобные библиотеки, использующие в своей основе синхронные модули Python (socket, os, ssl, time, select, thread, subprocess, sys, signal etc), просто возьмут и заблокируют нам основной процесс, цикл реактора и наступит беда. Такими библиотеками, к примеру, являются psycopg2, request, mysql и другие. В частности, psycopg2 используется в Django ORM как один из бекендов баз данных.

##### Что же делать?

Есть три пути. Сложный, приемлемый и хороший. Сложный — реализовать аналог библиотеки на Twisted. Приемлемый — использовать deferToThread и запускать синхронный код в отдельных потоках (используя пул потоков реализованный в Twisted). О хорошем пути (по моему мнению) и пойдет речь в заметке. [![Скрестить ежа с ужом][3]][4] [Читать дальше →][5]

[1]: https://twistedmatrix.com/trac/
[2]: https://en.wikipedia.org/wiki/Reactor_pattern
[3]: https://habrastorage.org/files/603/884/7fb/6038847fb6d740b5b2abe5f02a8d01fb.jpg "Скрестить ежа с ужом"
[4]: /post/266887/
[5]: http://habrahabr.ru/post/266887/#habracut