coroutine

Convert callback hell to deferred object

烈酒焚心 提交于 2021-01-27 05:25:26
问题 Background : So, I have a pretty big project with a lot of API functions. I'm thinking of completely moving to coroutines, but as they are implemented as Callback and not Deferred , I can not use them efficiently. For instance: I would like to do apiCallOne() , apiCallTwo() and apiCallThree() async and call .await() to wait till the last request is completed before changing UI. Now the project is structured like this: At the very bottom (or top) is ApiService.java : interface ApiService {

API 分页设计与实现探讨

我的梦境 提交于 2021-01-26 07:10:07
对于设计和实现 API 来说,当结果集包含成千上万条记录时,返回一个查询的所有结果可能是一个挑战,它给服务器、客户端和网络带来了不必要的压力,于是就有了分页的功能。 通常我们通过一个 offset 偏移量或者页码来进行分页,然后通过 API 实现类似请求: GET /api/products?page= 10 { "items" : [.. .100 products]} 如果要继续访问后续数据,则修改分页参数即可。 GET /api/products?page= 11 { "items" : [...another 100 products]} 在使用 offset 的情况下,通常使用 ?offset=1000 和 ?offset=1100 这种大家都熟悉的方法。它要么直接调用 OFFSET 1000 LIMIT 100 的 SQL 查询数据库,要么使用 LIMIT 乘以 page 作为查询参数。无论如何, 这是一个次优的解决方案 ,因为无论哪种数据库都要跳过前面 offset 指定的 1000 行。而跳过额外的offset,不管是 PostgreSQL,ElasticSearch还是 MongoDB 都存在额外开销,数据库需要对它们进行排序,计数,然后将前面不用的数据扔掉。 粉丝福利: 手撸了 50 个 Java 项目实战后,我超神了! 这是一种低效的方法,但由于它使用简单

API 分页探讨:offset 来分页真的有效率?

浪尽此生 提交于 2021-01-25 13:46:55
对于设计和实现 API 来说,当结果集包含成千上万条记录时,返回一个查询的所有结果可能是一个挑战,它给服务器、客户端和网络带来了不必要的压力,于是就有了分页的功能。 通常我们通过一个 offset 偏移量或者页码来进行分页,然后通过 API 实现类似请求: GET /api/products? page =10 { "items" : [ .. .100 products]} 如果要继续访问后续数据,则修改分页参数即可。 GET /api/products? page =11 { "items" : [ .. .another 100 products]} 在使用 offset 的情况下,通常使用 ?offset=1000 和 ?offset=1100 这种大家都熟悉的方法。它要么直接调用 OFFSET 1000 LIMIT 100 的 SQL 查询数据库,要么使用 LIMIT 乘以 page 作为查询参数。 无论如何, 「这是一个次优的解决方案」 ,因为无论哪种数据库都要跳过前面 offset 指定的 1000 行。而跳过额外的offset,不管是 PostgreSQL,ElasticSearch还是 MongoDB 都存在额外开销,数据库需要对它们进行排序,计数,然后将前面不用的数据扔掉。 这是一种低效的方法,但由于它使用简单,所以大家重复地用这个方法,也就是直接把 API

Skynet基于Actor模式的开源框架

偶尔善良 提交于 2021-01-13 13:14:25
使用多进程解决高并发带来的问题是进程安全锁,框架经常会因为部分代码的报错而导致死锁或内存占用不释放等诸多问题。而使用单进程的服务器框架,通过线程池来做消息轮询和任务执行,能够避开锁带来的诸多问题。 框架的初衷 众核时代的并行编程 免费的晚餐已经结束了(The Free Lunch Is Over -- Herb Sutter, 2005) E5420(2.5GHz 2004) VS E5-2620v3(2.4GHz 2014) 我们获得了更多的核心、更多的线程、更大的缓存、更大的带宽。我们得不到更高的主频。 Erlang 1998年Erlang开源 2006年传入国内C++程序员圈 Erlang China User Group始于2007,现改名为Effective Cloud User Group 并行和分布式 Erlang采用的Actor模式使其增长并行处理,错误处理机制和储存管理为分布式服务,Erlang并不擅长存储密集型数值计算。 Actor模式 一切都是Actor 一切都是Object?并行的面向对象模式!创建actor/处理消息/发送消息。发送的消息和发送者解耦、异步通讯。 没有Actor的语言提供的框架 Akka by Scala、CAF: C++ Actor Framework by C++、Remact.Net by .net Skynet 2010 年想法

python---异步IO(asyncio)协程

给你一囗甜甜゛ 提交于 2021-01-03 16:53:45
简单了解 在py3中内置了asyncio模块。其编程模型就是一个消息循环。 模块查看: from .base_events import * from .coroutines import *  #协程模块,可以将函数装饰为协程 from .events import *  #事件模块,事件循环和任务调度都将使用到他 from .futures import *   #异步并发模块,该模块对task封装了许多方法,代表将来执行或没有执行的任务的结果。它和task上没有本质上的区别 from .locks import *  #异步保证资源同步 from .protocols import * from .queues import * from .streams import * from .subprocess import * from .tasks import *  #创建任务,是对协程的封装,可以查看协程的状态。可以将任务集合 from .transports import * 调用步骤: 1.当我们给一个函数添加了async关键字,或者使用 asyncio.coroutine装饰器装饰 ,就会把它变成一个 异步函数。 2. 每个线程有一个事件循环,主线程调用asyncio.get_event_loop时会创建事件循环 , 3.将任务封装为集合 asyncio

asyncio/aiohttp - create_task() blocks event loop, gather results in “This event loop is already running ”

落花浮王杯 提交于 2021-01-01 08:15:08
问题 I cannot get both my consumer and my producer running at the same time, it seems worker(), or the aiohttp server are blocking - even when executed simultaneously with asyncio.gather() If instead I do loop.create_task(worker), this will block and server will never be started. I've tried every variation I can imagine, including nest_asyncio module - and I can only ever get one of the two components running. What am I doing wrong? async def worker(): batch_size = 30 print("running worker") while

asyncio/aiohttp - create_task() blocks event loop, gather results in “This event loop is already running ”

假如想象 提交于 2021-01-01 08:12:18
问题 I cannot get both my consumer and my producer running at the same time, it seems worker(), or the aiohttp server are blocking - even when executed simultaneously with asyncio.gather() If instead I do loop.create_task(worker), this will block and server will never be started. I've tried every variation I can imagine, including nest_asyncio module - and I can only ever get one of the two components running. What am I doing wrong? async def worker(): batch_size = 30 print("running worker") while

python 3 asyncio: coroutines execution order using run_until_complete(asyncio.wait(corutines_list))

不想你离开。 提交于 2020-12-05 12:14:43
问题 I have what is probably a quite useless question, but nevertheless I feel I am missing something that might be important to understand how asyncio works. I just started to familiarize with asyncio and I wrote this very basic piece of code: import asyncio import datetime from random import randint async def coroutine(i): start = datetime.datetime.now() print('coroutine {} started.'.format(i)) n = randint(1, 11) await asyncio.sleep(n) end = datetime.datetime.now() print('coroutine {} finished

python 3 asyncio: coroutines execution order using run_until_complete(asyncio.wait(corutines_list))

痴心易碎 提交于 2020-12-05 12:11:20
问题 I have what is probably a quite useless question, but nevertheless I feel I am missing something that might be important to understand how asyncio works. I just started to familiarize with asyncio and I wrote this very basic piece of code: import asyncio import datetime from random import randint async def coroutine(i): start = datetime.datetime.now() print('coroutine {} started.'.format(i)) n = randint(1, 11) await asyncio.sleep(n) end = datetime.datetime.now() print('coroutine {} finished

装饰器 -- 函数装饰器(tornado异常响应装饰器)

为君一笑 提交于 2020-12-05 00:58:50
# 值可变,每次使用需要重新赋值 ERR_RESP_TEMPLATE = { " state " : " FAILED " , " error " : None} RESP_TEMPLATE_4_DELETE = { " tenant_id " : "" , " state " : " FAILED " , " error " : None} def _catch_except_args(err_dict= ERR_RESP_TEMPLATE): def _catch_except(func): @gen.coroutine def wrapped_func(self, *args, ** kwargs): """ wrapped function """ try : yield func(self, *args, ** kwargs) except TMException as excep: _LOG.exception(str(excep)) err_dict[ " state " ] = " FAILED " # RESP_TEMPLATE_4_DELETE["state"]可能为"SUCCEED" err_dict[ ' error ' ] = str(excep) self._write( 200 , err_dict) except Exception as excep