View index.js
function drawArray(arr) {
/*
Thanks original author @vukicevic
Usage:
Pass a two-dimensional arrary.
The first dimonsion is rows, the second one is columns.
Note that in columns, each pixel is represented by four nums as BGRA, so the columns' length is four times as image's length.
return image's base64 code.
*/
View index.md

asyncio won't automatically create event loop for sub-thread, so to run async tasks in sub-thread, we need to manually create an event loop first.

loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
asyncio.ensure_future(task())
loop.run_forever()
View index.md

tornado has its own event loop which is incompatible with asyncio's event loop. But it can be solved.

First, create a BaseHandler extended from tornado.web.RequestHandler:

class BaseHandler(tornado.web.RequestHandler):

    @staticmethod
    def asyncio_task(method):
        @functools.wraps(method)
        async def wrapper(self, *args, **kwargs):