- 主题:请问一下协程怎么替代while true
我有一个函数:
async def fn():
while true:
print(111)
我想用协程的方法并行运行这个函数,多个任务启动起来了,但是运行起来后就因为while ture的原因只运行其中一个任务了,这个地方我应该怎么替换掉while ture呢
--
FROM 112.45.96.*
【 在 hgoldfish 的大作中提到: 】
: 如果你 while 循环内部不是 print() 语句,而是网络连接的处理:
: async def handle_client(reader, writer):
: while True:
: ...................
我是希望不要跳出这个while循环,多个同样的函数一起运行,达到的效果类似于多个进程分别运行,这个有办法吗
--
FROM 112.45.96.*
【 在 hgoldfish 的大作中提到: 】
: 看看 asyncio 里面有没有协程池这个东西。
: 如果是 gevent 的话是有协程池的,在 while True 里面可以不断地往协程池里面 submit 任务。这不就是典型的 socket accept() 的应用场景吗?
:
其实我用来做交易的一个东西,那个函数相当于一个策略,用到不同的品种上,websocket接收数据,然后死循环不停计算,如果用进程太占资源了
--
FROM 112.45.96.*
【 在 ToSimplicity 的大作中提到: 】
: 你没理解协程的意思
: 协程并不是并行处理, 而是CPU干一会这个活干一会那个活
: 你的循环里CPU要一直干活啊, 如果要干一会就不干了, 就得明说啊
这个我知道,我就是不知道这个while true这个地方我应该怎么用别的语法替代,让它可以循环起来
--
FROM 112.45.96.*
【 在 hgoldfish 的大作中提到: 】
: 不是进程,我发的代码是协程。
: 你到底是要 IO 还是计算?协程是搞并发 IO 的,进程是搞并行计算的,这是两回事。
: 线程和进程用的是 executor,在 asyncio 库里面也支持,或者用 multiprocessing 模块也有。
: ...................
是并行计算,按理说协程计算不占优势的,不过我试过多进程,太占资源了,我用来跑程序的云服务器配置比较低,我要并行运行的程序比较多,所以多进程不适合
--
FROM 112.45.96.*
【 在 iwannabe 的大作中提到: 】
: async def handle_packet(packet):
: xxxxx
:
: ...................
我是希望
async def read_from_websocket(uri):
async with websockets.connect(uri) as websocket:
while True:
packet = await websocket.recv()
await handle_packet(packet)
这个函数能并行同时运行多个,达到类似多进程的效果,你这样写好像只能运行一个
--
FROM 112.45.96.*
【 在 iwannabe 的大作中提到: 】
: 你的websocket是多个连接吗?如果只有一个,这个recv/handle是异步的,效果和执行多
: 个read_from_websocket 一样
: 如果是多个,你可以用
: ...................
是一个数据服务器,多个客户端去连接,我是了你说的这个办法,不知道为啥收不到数据,如果task只有一个,是能收到数据的
--
FROM 112.45.96.*
【 在 hgoldfish 的大作中提到: 】
: 多进程占资源是指什么吗?
: 依我看,如果你有 16 个核心的话,也不过多占了 16 个 Python 进程的内存空间而已。如果你用 multiprocessing 模块,可以把数据放到共享内存里面,不会太占用资源的吧。
:
云服务器,最开始只有两个核心。。。后面加了两个,同时要运行几十个策略
--
FROM 112.45.96.*
【 在 fanci 的大作中提到: 】
: while True:
: await asyncio.sleep(0) // 或者 0.01
试了,还是跳不出来,同时只运行了一个
--
FROM 112.45.96.*
【 在 hmgo1988 的大作中提到: 】
: await呗
: 发自「今日水木 on iPhone 13」
改成
while True:
do xxx
await asyncio.sleep(0)
还是没用
--
FROM 112.45.96.*