- 主题:请问一下协程怎么替代while true
我有一个函数:
async def fn():
while true:
print(111)
我想用协程的方法并行运行这个函数,多个任务启动起来了,但是运行起来后就因为while ture的原因只运行其中一个任务了,这个地方我应该怎么替换掉while ture呢
--
FROM 112.45.96.*
如果你 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.*
【 在 hgoldfish 的大作中提到: 】
: 如果你 while 循环内部不是 print() 语句,而是网络连接的处理:
: async def handle_client(reader, writer):
: while True:
: ...................
我是希望不要跳出这个while循环,多个同样的函数一起运行,达到的效果类似于多个进程分别运行,这个有办法吗
--
FROM 112.45.96.*
看看 asyncio 里面有没有协程池这个东西。
如果是 gevent 的话是有协程池的,在 while True 里面可以不断地往协程池里面 submit 任务。这不就是典型的 socket accept() 的应用场景吗?
【 在 migrant 的大作中提到: 】
: 我是希望不要跳出这个while循环,多个同样的函数一起运行,达到的效果类似于多个进程分别运行,这个有办法吗
--
FROM 117.24.94.*
【 在 hgoldfish 的大作中提到: 】
: 看看 asyncio 里面有没有协程池这个东西。
: 如果是 gevent 的话是有协程池的,在 while True 里面可以不断地往协程池里面 submit 任务。这不就是典型的 socket accept() 的应用场景吗?
:
其实我用来做交易的一个东西,那个函数相当于一个策略,用到不同的品种上,websocket接收数据,然后死循环不停计算,如果用进程太占资源了
--
FROM 112.45.96.*
【 在 ToSimplicity 的大作中提到: 】
: 你没理解协程的意思
: 协程并不是并行处理, 而是CPU干一会这个活干一会那个活
: 你的循环里CPU要一直干活啊, 如果要干一会就不干了, 就得明说啊
这个我知道,我就是不知道这个while true这个地方我应该怎么用别的语法替代,让它可以循环起来
--
FROM 112.45.96.*
不是进程,我发的代码是协程。
你到底是要 IO 还是计算?协程是搞并发 IO 的,进程是搞并行计算的,这是两回事。
线程和进程用的是 executor,在 asyncio 库里面也支持,或者用 multiprocessing 模块也有。
【 在 migrant 的大作中提到: 】
: 其实我用来做交易的一个东西,那个函数相当于一个策略,用到不同的品种上,websocket接收数据,然后死循环不停计算,如果用进程太占资源了
--
修改:hgoldfish FROM 117.24.94.*
FROM 117.24.94.*
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)
asyncio.run(read_from_websocket(uri))
【 在 migrant 的大作中提到: 】
: 其实我用来做交易的一个东西,那个函数相当于一个策略,用到不同的品种上,
: websocket接收数据,然后死循环不停计算,如果用进程太占资源了
--
FROM 119.139.197.*
【 在 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.*