- 主题:请问一下协程怎么替代while true
那可能就是我最开始说的,语言没有就要等等了...
【 在 hgoldfish 的大作中提到: 】
: c#, java (project loom), go 都能自动在线程间调度协程的。python 没有这个功能。所以我已经和楼主说了 multiprocessing.pool.Pool 可以用,里面有 apply() 和 map(), imap() 可用。
: 你不懂 Python,拿个 c# 代码给楼主有啥用啊?
:
--
FROM 123.116.219.*
Python 里面没自动调度,但是有手动调度的啊。这都不是啥特别的东西。
【 在 leadu 的大作中提到: 】
: 那可能就是我最开始说的,语言没有就要等等了...
--
修改:hgoldfish FROM 183.253.146.*
FROM 183.253.146.*
外面还是要asyncio.gather()的呀……
async def f(i):
while True:
asyncio.sleep(0)
// do something
async def g():
fs = [asyncio.create_task(f(i)) for i in range(10)]
await asyncio.gather(fs)
asyncio.run(g())
【 在 migrant (migrant) 的大作中提到: 】
: 发信人: migrant (migrant), 信区: Python
: 标 题: Re: 请问一下协程怎么替代while true
: 发信站: 水木社区 (Fri May 26 22:40:20 2023), 转信
:
--
FROM 183.179.53.*
【 在 ToSimplicity 的大作中提到: 】
: 不理解, 你是要
: do xxx-1
: do xxx-2
: ...................
第二种
--
FROM 112.45.96.*
【 在 migrant 的大作中提到: 】
:
: 我是希望不要跳出这个while循环,多个同样的函数一起运行,达到的效果类似于多个进程分别运行,这个有办法吗
你没理解协程是什么,
协程是多线程的一种, 是多任务的一种实现方式,
多任务分为抢占式多任务, 和协作式多任务,
现在操作系统的线程基本上是分时抢占式的, 也就是无论一个线程完成了多少, 都要按时间片强制分配。
而协程, 恰恰是另一种协作式多任务, 换句话说, 一个任务占用了资源,只有主动让出,
其它任务才能有机会获得, 这个有点像上厕所。
而这个让出资源的动作, 在协程库里面就是靠await参数, 当await修饰的的调用函数,也是协程友好,就会主动让出,但是, 如果修饰的函数本身就是繁忙的,或者并不是协程友好的函数,换句话说, 它会占着茅坑不拉屎, 那实际上也发挥不出协程优势。
资源, 进入等待,从而其它任务有机会得到资源运行。
--
修改:poggy FROM 124.126.2.*
FROM 124.126.2.*
你到底试过 asyncio 的 run_in_executor() 和 gather() 这些 API 了没有啊。
【 在 migrant 的大作中提到: 】
: 第二种
--
FROM 183.253.146.*
又要马儿跑,又不让马儿多吃草?
【 在 migrant 的大作中提到: 】
: 是并行计算,按理说协程计算不占优势的,不过我试过多进程,太占资源了,我用来跑程序的云服务器配置比较低,我要并行运行的程序比较多,所以多进程不适合
--
FROM 163.125.197.*
试了gather
【 在 hgoldfish (老鱼) 的大作中提到: 】
: 发信人: hgoldfish (老鱼), 信区: Python
: 标 题: Re: 请问一下协程怎么替代while true
: 发信站: 水木社区 (Sat May 27 10:17:54 2023), 转信
:
--
FROM 112.45.96.*
内存并不会多占吧
【 在 hgoldfish 的大作中提到: 】
: 多进程占资源是指什么吗?
: 依我看,如果你有 16 个核心的话,也不过多占了 16 个 Python 进程的内存空间而已。如果你用 multiprocessing 模块,可以把数据放到共享内存里面,不会太占用资源的吧。
--
FROM 139.226.19.*
【 在 ToSimplicity 的大作中提到: 】
: [code=py]
: #
: import asyncio
: ...................
我的逻辑里有一个while true,这样就跳不出去了
async def do_while_true_tasks(name):
while True:
print(f'# Project <{name}> starts.')
for i in range(5):
await do_cpu_intense_unit_work(f'project {name} -> step {i}')
await asyncio.sleep(0)
print(f'# Project <{name}> ends.')
--
FROM 112.45.96.*