我最近偶然发现了混淆gevent和基于asyncio的代码的问题,因为当我用猴子修补它们时,某些同步库可以很好地工作gevent.monkey.patch_all()。我找到了该aiogevent库,该库似乎对实现PEP 3156有所帮助,并将asyncio事件循环替换为您选择的其他实现(在本例中为gevent)。我发现的git仓库的最后一次重大提交是在4年前。修复setup.py之后,我设法成功安装了它,但是问题是它没有通过所有测试。
这些测试之一是test_soon,它产生应该执行操作并停止循环的greenlet。该测试将永远挂起,因为loop.stop()对循环没有任何影响,该循环预计将在所有任务完成后停止。我写了两个代码片段来检查它是否在传统的协程中发生,而另一个则通过来检查gevent.spawn。
import gevent
import aiogevent
import asyncio
asyncio.set_event_loop_policy(aiogevent.EventLoopPolicy())
loop = asyncio.get_event_loop()
async def func():
print('bloop')
loop.stop()
loop.create_task(func())
loop.run_forever() # works alright and stops as soon as func finish
Run Code Online (Sandbox Code Playgroud)
和gevent.spawn:
import gevent
import aiogevent
import asyncio
asyncio.set_event_loop_policy(aiogevent.EventLoopPolicy())
loop = asyncio.get_event_loop()
def func():
print('bloop')
loop.stop()
g = gevent.spawn(func)
loop.run_forever() # func is executed as soon as loop runs, but loop.stop() is ignored
Run Code Online (Sandbox Code Playgroud)
问题是:这里可能出什么问题?我清楚地看到,在启动循环之后,greenlet会运行,但是循环是否“未跟踪”?我在异步源中找不到与该机制相对应的确切行,对于gevent来说也是如此-我对这些模块的内部并不十分熟悉,并且通过它们进行搜索令人困惑,但是我想知道有什么区别和aiogevent为了通过测试,必须对事件循环进行哪些更改。
upd1:为了强调该问题,gevent.hub.Hub …
在最近的Python 3.6版本中使用新的f字符串时,我注意到以下内容:
我们创建一个foo值为的变量bar:
>>> foo = 'bar'
Run Code Online (Sandbox Code Playgroud)然后,我们声明一个新变量,它是我们的f-string,它应该foo被格式化:
>>> baz = f'Hanging on in {foo}'
Run Code Online (Sandbox Code Playgroud)好的,一切正常,然后我们打电话baz来检查它的价值:
>>> baz
'Hanging on in bar'
Run Code Online (Sandbox Code Playgroud)让我们尝试更改值foo并baz再次调用:
>>> foo = 'spam'
>>> baz
'Hanging on in bar'
Run Code Online (Sandbox Code Playgroud)它不应该是动态的吗?为什么会这样?我认为如果foo改变了值,f-string会更新,但是这没有发生.我不明白这是如何工作的.
问题是:
我尝试在无限循环中播放快速跟踪器模块,但这样做只是从开始重放音乐,而不是跟随重复位置.
示例:( 这是模块https://api.modarchive.org/downloads.php?moduleid=153915#zeta_force_level_2.xm的来源)
import pygame
pygame.mixer.init()
pygame.mixer.music.load('/path/to/zeta_force_level_2.xm')
pygame.mixer.music.play(-1)
Run Code Online (Sandbox Code Playgroud)
我想要实现的目的:循环播放模块音乐,每次循环播放重复位置,而不是开始播放.使用pygame没有必要:我使用它是因为我找不到任何适合播放跟踪音乐的东西
提前致谢.
python ×3
python-3.x ×3
asynchronous ×1
audio-player ×1
f-string ×1
gevent ×1
pygame ×1
python-3.6 ×1