小编Max*_*nar的帖子

aiogevent事件循环“失败”以跟踪greenlet

我最近偶然发现了混淆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 asynchronous gevent python-3.x python-asyncio

14
推荐指数
1
解决办法
275
查看次数

为什么f-strings在它们引用的变量发生变化时不会改变?

在最近的Python 3.6版本中使用新的f字符串时,我注意到以下内容:

  1. 我们创建一个foo值为的变量bar:

    >>> foo = 'bar'
    
    Run Code Online (Sandbox Code Playgroud)
  2. 然后,我们声明一个新变量,它是我们的f-string,它应该foo被格式化:

    >>> baz = f'Hanging on in {foo}'
    
    Run Code Online (Sandbox Code Playgroud)
  3. 好的,一切正常,然后我们打电话baz来检查它的价值:

    >>> baz
    'Hanging on in bar'
    
    Run Code Online (Sandbox Code Playgroud)
  4. 让我们尝试更改值foobaz再次调用:

    >>> foo = 'spam'
    >>> baz
    'Hanging on in bar'
    
    Run Code Online (Sandbox Code Playgroud)

它不应该是动态的吗?为什么会这样?我认为如果foo改变了值,f-string会更新,但是这没有发生.我不明白这是如何工作的.

python python-3.x python-3.6 f-string

9
推荐指数
1
解决办法
527
查看次数

pygame.mixer.music.play()无法识别快速跟踪器(.xm音乐格式)重复位置

问题是:

我尝试在无限循环中播放快速跟踪器模块,但这样做只是从开始重放音乐,而不是跟随重复位置.

示例:( 这是模块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 pygame audio-player python-3.x

9
推荐指数
1
解决办法
568
查看次数