您可以通过查看页面来判断。 JSON序列化为每秒283,645。
但是,该数字几乎没有实际意义。
首先,典型的Web服务器执行诸如用户身份验证,数据库访问和HTML创建之类的过程,因此处理时间要长得多。 这仅意味着Sanic的处理时间可以忽略不计。
而且,在很多情况下,Web应用程序每秒需要超过1000个进程。 首先,诸如Niginx之类的Web服务器可以处理和缓存静态文件。 如果这样做的话,公司的10,000名员工的内部系统不太可能每秒需要1000个流程。
即使在现在,仍主要使用Dgango和Flask,因为它们在许多情况下通常就足够了。 如果遇到问题,通常最好使用Go语言,该语言比在Python中使用Sanic更快,并且具有更多的并行处理功能。 请注意,这并不意味着不使用Sanic,而是如果每秒的进程数量变得非常大,则Python本身通常不适合该进程。 。
感谢您的回答。
>通常,最好使用Go语言,该语言比Python中使用Sanic更快,并且具有更多并行处理功能。
>通常,最好使用Go语言,该语言比Python中使用Sanic更快,并且具有更多并行处理功能。
我一起看
结论
- GIL确保多线程不会从多核中受益。
如果这个博客是对的,并且我们一起考虑,那么Python是一种不利用多核CPU的编程语言。 如果您不需要AI(人工智能)或机器学习库,那么Go lang比Python更好,但是如果AI(人工智能)和机器学习库针对Go lang,Python进行了增强我们希望将来能解决多核CPU的框架或正式支持。 Google还开发了一个名为TensorFlow for Go lang 的AI,机器学习和数值分析库。 尽管此API可以与Go lang一起使用,但仍然只有Python可以构建和学习模型,因此我希望将来会对其进行改进。
就GIL而言,这通常不是问题,因为可以通过用C / C ++编写或使用C / C ++编写的库来消除繁重的处理。 但是,如果每秒的操作数变得非常大,则无法避免处理冲突,并且Python效率低下。 因此,我只建议使用Go。 如果不是很大,那么仅使用Python进行开发就不会有问题。 对于大规模应用,可能需要计算和测试Python是否能单独承受和测试。
对于机器学习,训练使用大量数据来进行大量计算。 在这方面,Python擅长Go,而擅长Go,因此Go将永远无法构建和学习机器学习模型。
另一方面,在使用学习结果的过程中,由于仅使用结果,因此计算是轻量的。 如果您必须在此处处理大量处理,则可以使用Go的API,因为出于上述原因,Go更适合。
TesorFlow和Go都是由Google开发的,但这是考虑到Python和Go的特性的结果,因此最好将其统一。
显示问题
受访者介绍
阅读Python3的博客是验证。
也许吧
在Python2和3中,由于它是伪造的多核和多线程,因此已验证它与真正的多核和多线程(例如JAVA或Go lang(Go语言))不同。
真正的具有uvloop的多核和多线程支持?
也许可以说。
怡安首席执行官石冢正宏
电话:042-559-8638
iPhone:070-3861-5011
找出为什么asyncio使用POSIX线程
共享的。
Tokibito-sensei( id:nullpobug )叫到办公室去玩,所以我们去了公开的收藏家。 我与aodag先生聊天 ( id:aodag ),但我记得我以前担心过的事情。
我很担心
在准备学习报告的演示文稿时,我准备了一个代码示例,该示例使用asyncio和aiohttp向服务器发送HTTP请求。
导入 aiohttp 导入异步 异步def 提取 (l,url): 与 aiohttp.ClientSession(loop = l) 作为会话异步: 与 session.get(URL)异步作为响应: 返回等待response.text() 异步def main (l,url,num): 任务= [ 为 范围 (num)中的_提取(l,url)] 返回等待asyncio.gather(*任务) 如果 __name__ == ' __main__ ' : 循环= asyncio.get_event_loop() 结果= loop.run_until_complete(主要(循环, 'http://本地主机:8000' , 3 )) 对于 r结果: 打印 (r)
PyCharm具有显示“并发图”的功能,可以检查线程和进程的移动,执行该代码时线程的行为如下。
由于某种原因,出现了current.futures.ThreadPoolExecutor。 我试图找出文档中写的内容,但是由于找不到任何此类描述,我放弃了,问奥达格和托基比托。
socket.getaddrinfo
他在几十分钟内找到了原因。
socket.getaddrinfo
是同步执行的,因此cpython实现似乎不是异步执行此操作,而是concurrent.futures.ThreadPoolExecutor
多个线程中执行current.futures.ThreadPoolExecutor。- https://github.com/python/cpython/blob/6f0eb93183519024cb360162bdd81b9faec97ba6/Lib/asyncio/base_events.py#L666-L673
- https://github.com/python/cpython/blob/6f0eb93183519024cb360162bdd81b9faec97ba6/Lib/asyncio/base_events.py#L627-L636
导入异步 进口 aioredis 异步def connection_example (key): conn =等待aioredis.create_connection( '/tmp/redis.sock' ) return await conn.execute( 'GET' ,键) 异步def main (数字): 任务= [ 范围 (num)中_的connection_example( 'my-key' )] 返回等待asyncio.gather(*任务) 如果 __name__ == ' __main__ ' : 循环= asyncio.get_event_loop() 结果= loop.run_until_complete(主要( 3 )) 对于 r结果: 打印 (r)
顺便说一下,redis config是↓。
守护否 pidfile /var/run/redis.pid unixsocket /tmp/redis.sock unixsocketperm 700 日志文件“” 数据库1
看这时的并发图,
当然,没有创建线程。
访问外部Redis服务器
另一方面,如果您在外部准备一个Redis服务器并连接它(这次我使用arukas.io ),
导入异步 进口 aioredis 异步def connection_example (key): conn =等待aioredis.create_connection( ( 'seaof-xxx-xxx.arukascloud.io' , 311390 ), db = 0 ,密码= 'xxxxxxxxxxxxxxx' ) return await conn.execute( 'GET' ,键) 异步def main (数字): 任务= [ 范围 (num)中_的connection_example( 'my-key' )] 返回等待asyncio.gather(*任务) 如果 __name__ == ' __main__ ' : 循环= asyncio.get_event_loop() 结果= loop.run_until_complete(主要( 3 )) 对于 r结果: 打印 (r)
执行后,如下所示。
似乎毕竟创建了一个工作线程。
为ThreadPoolExecutor创建了多少个工作线程?
将信号量中的同时执行次数限制为3时的并发图如下。
显然,ThreadPoolExecutor中的Thread不被重用。 ThreadPoolExecutor下的文档中描述了它的创建程度。
如果max_workers为None或未指定,则默认值为计算机上的处理器数乘以5。17.4。Concurrent.futures –并发任务执行– Python 3.6.1文档
我发送了大约30个试用请求(信号量为3)。
生成了多达20个,并确认此后它们已被重新使用。 尽管由于实现原因无法更改工作线程的上限,但是不太可能出现任何问题。
uvloop
至于uvloop,已确认他们不使用POSIX线程就可以工作。
导入 uvloop #省略 循环= uvloop.new_event_loop() asyncio.set_event_loop(循环)
执行后,
真的
结论
Aodag-sensei和tokibito-sensei很棒……我正在阅读文件,使文件潮湿,但是花了我几分钟的时间才找到原因并告诉我。 从明天起我也是社会的一员,所以我要为两个人努力。
与aodag先生和tokibito先生一起开放的收藏家似乎正在寻找工作。 谢谢你
0 コメント:
コメントを投稿