- 主题:请问一下协程怎么替代while true
如果你 while 循环内部不是 print() 语句,而是网络连接的处理:
async def handle_client(reader, writer):
while True:
buf = await reader.read(1024 * 4)
if not buf:
break
这些协程函数就可以并行了。因为函数中间的 await 会把当前协程切换出来给事件循环协程。而单纯的 print() 语句会一直占满整个线程,让别的协程没有运行的机会。
【 在 migrant 的大作中提到: 】
: 我有一个函数:
: async def fn():
: while true:
: ...................
--
FROM 117.24.94.*
看看 asyncio 里面有没有协程池这个东西。
如果是 gevent 的话是有协程池的,在 while True 里面可以不断地往协程池里面 submit 任务。这不就是典型的 socket accept() 的应用场景吗?
【 在 migrant 的大作中提到: 】
: 我是希望不要跳出这个while循环,多个同样的函数一起运行,达到的效果类似于多个进程分别运行,这个有办法吗
--
FROM 117.24.94.*
不是进程,我发的代码是协程。
你到底是要 IO 还是计算?协程是搞并发 IO 的,进程是搞并行计算的,这是两回事。
线程和进程用的是 executor,在 asyncio 库里面也支持,或者用 multiprocessing 模块也有。
【 在 migrant 的大作中提到: 】
: 其实我用来做交易的一个东西,那个函数相当于一个策略,用到不同的品种上,websocket接收数据,然后死循环不停计算,如果用进程太占资源了
--
修改:hgoldfish FROM 117.24.94.*
FROM 117.24.94.*
多进程占资源是指什么吗?
依我看,如果你有 16 个核心的话,也不过多占了 16 个 Python 进程的内存空间而已。如果你用 multiprocessing 模块,可以把数据放到共享内存里面,不会太占用资源的吧。
【 在 migrant 的大作中提到: 】
: 是并行计算,按理说协程计算不占优势的,不过我试过多进程,太占资源了,我用来跑程序的云服务器配置比较低,我要并行运行的程序比较多,所以多进程不适合
--
FROM 117.24.94.*
Python 也有这个东东。但楼主一直到现在都没讲清楚,他要的是并行多进程计算还是并发多协程。而且 for each 也满足不了楼主想要的一直不退出这个需求。
【 在 leadu 的大作中提到: 】
: 好长时间没见了老鱼你协程水平还是不够啊
: lz这个场景是个很正常很常见的需求,c#中是Parallel.ForEach,别的语言对照着搜呗,带async的都有,没有等等也会有的
--
FROM 117.24.94.*
这个不就是进程池的应用吗?你开`cpu_count() * 2 + 1`个进程的进程池处理请求就行了。不会占用很多资源。
【 在 migrant 的大作中提到: 】
: 云服务器,最开始只有两个核心。。。后面加了两个,同时要运行几十个策略
--
FROM 117.24.94.*
c#, java (project loom), go 都能自动在线程间调度协程的。python 没有这个功能。所以我已经和楼主说了 multiprocessing.pool.Pool 可以用,里面有 apply() 和 map(), imap() 可用。
你不懂 Python,拿个 c# 代码给楼主有啥用啊?
【 在 leadu 的大作中提到: 】
: 比如要10个协程,直接调用10次,最后task.whenall就得了,cpu不够lz自己加呗,反正cpu没有浪费
: foreach也可以,10个10个的策略来,跑完100个策略foreach就退出了,这100个策略跑几天也没有关系
--
FROM 117.24.94.*
Python 里面没自动调度,但是有手动调度的啊。这都不是啥特别的东西。
【 在 leadu 的大作中提到: 】
: 那可能就是我最开始说的,语言没有就要等等了...
--
修改:hgoldfish FROM 183.253.146.*
FROM 183.253.146.*
你到底试过 asyncio 的 run_in_executor() 和 gather() 这些 API 了没有啊。
【 在 migrant 的大作中提到: 】
: 第二种
--
FROM 183.253.146.*