大佬们 我这协程写的有毛病吗?

2020-01-19 14:39:27 +08:00
 Ritter

想用 Python 做一个后台扫描工具
仿照 asyncio 官网的生产者消费者模式写了一个 demo
发现运行到一半会阻塞住(有时会,有时不会?)
但我看着貌似不会卡住啊
求大佬救救孩子

6920 次点击
所在节点    Python
55 条回复
Ritter
2020-01-19 14:41:35 +08:00
对了
生产者是从本地文件夹读取字典文件
消费者拼接 url 发起请求
Ritter
2020-01-19 14:52:05 +08:00
难受
cz5424
2020-01-19 15:08:33 +08:00
你贴代码吧这样描述没人能解答
Ritter
2020-01-19 15:10:04 +08:00
@cz5424 大佬上面有代码
cz5424
2020-01-19 15:12:41 +08:00
@Ritter 阻塞的时候中断看看阻塞在哪个语句
Ritter
2020-01-19 15:14:09 +08:00
chenqh
2020-01-19 15:15:47 +08:00
你的日志也太少了把!!
put 的日志打印一些?
ipwx
2020-01-19 15:16:48 +08:00
大哥 readFromFolder 是阻塞的,你在 async def put 里面得用线程池去执行它。asyncio 的主线程是单线程,没法执行这种阻塞函数。

https://docs.python.org/3/library/asyncio-eventloop.html#asyncio.loop.run_in_executor
ipwx
2020-01-19 15:17:09 +08:00
顺便吐槽一句楼上,这么明显的问题不是一眼就能看出来么
Ritter
2020-01-19 15:17:36 +08:00
@cz5424 Ctrl C 中断不了
ipwx
2020-01-19 15:17:50 +08:00
除了 readFromFolder, f.read() 也是阻塞的,也得放在 executor 里面
Ritter
2020-01-19 15:20:11 +08:00
@ipwx 可是他是执行到一半的时候阻塞了 self.q.put()这句代码是可以执行到的
ipwx
2020-01-19 15:22:54 +08:00
@Ritter 楼主也没放日志(差评)。

不过 async def put 这个函数问题太大了,怎么都会出问题的。
ipwx
2020-01-19 15:25:46 +08:00
=== 我发现楼主还有个问题,在 async def run 里面。

他只创建了 consumer = asyncio.gather(...),但是没有勒令 consumer 进入执行啊?按照道理 asyncio.gather 并不具有执行一个 coroutine 的特性啊,只有 await 才能保证让一个 coroutine 进入运行状态啊?

楼主你得用 loop.create_task 把一个 coroutine 强行进入后台运行状态才对吧?
ipwx
2020-01-19 15:26:06 +08:00
顺便 loop.create_task 就不用 await 了
Ritter
2020-01-19 15:27:47 +08:00
@ipwx 代码都是官网抄的 怎么会出错我也不知道啊(狗头)
Ritter
2020-01-19 15:28:16 +08:00
@ipwx asyncio.gather 之后确实是会运行的 我试过了
chenqh
2020-01-19 15:29:19 +08:00
@Ritter 日志,日志呢?
ipwx
2020-01-19 15:31:30 +08:00
@Ritter 好吧我看了一眼文档,它当真会自动把 coroutine 变成 Task 给 schedule 起来。

"If any awaitable in aws is a coroutine, it is automatically scheduled as a Task."
youngce
2020-01-19 15:33:09 +08:00
赞同 ipwx,楼主你也要明白,目前 python 协程面临最大的问题的绝大多数第三方库均是同步的,不能支持协程异步。虽然现在已经与很多库在努力的兼容协程,但是在协程处理 io 库时,一定要请楚是否支持。不支持协程的 io 都要通过线程池来处理。官网也给出了 asyncio 中线程池的用法,可以再看看

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/639162

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX