小编wvx*_*xvw的帖子

asyncio:投机等待多个期货

TL; 博士

我怎样才能从期货集合中等待任何未来,有选择地通知其他期货“不再需要它们”?


这就是我需要这个的原因。我想创建一种特殊的期货/任务来计时,并且可以与其他期货/任务一起使用以在它们累积超过某个超时(或在与此计时任务交互后被迫停止)时取消它们。如果您熟悉 Go,它有一个类似的概念,称为Context.

为了使这更具体,想象一下。您有一个典型的 HTTP 客户端。为了从 URL 请求页面,它需要连续执行几个可能永远阻塞的操作。例如,这些操作可以是:

  1. 分配一个套接字。
  2. 连接到服务器。
  3. 以多个块检索页面。
  4. 关闭连接。
  5. 解除分配套接字。

假设您允许整个操作需要一分钟。但是您也知道分配套接字的时间不应超过一毫秒,连接也可能需要一分钟,检索块也是如此。断开连接和资源释放应该需要几毫秒。

假设现在您必须在每个项目符号点上等待完全超时——嗯,您已经超过了两次配额。因此,您需要将每次调用的计算增量传递给其后继调用。此外,假设您无法释放套接字——好吧,没什么大不了的,应用程序可能会从此错误中恢复,因此您还需要区分各种超时。我想这可以这样写(在某些虚构的 Python 版本中):

async def http_request(context, url):
    socket = await min(allocate_socket(), context.timeout, socket_timeout)
    await min(socket.connect(), context.timeout, connect_timeout)
    async for chunk in min(socket.receive(), context.timeout, chunk_timeout):
        print(chunk)
    await min(socket.close(), context.timeout, close_timeout)
Run Code Online (Sandbox Code Playgroud)

python python-asyncio

5
推荐指数
1
解决办法
2670
查看次数

你如何处理Lex中的关键字?

假设您有一种允许这样生成的语言:optional optional = 42,其中第一个"可选"是关键字,第二个"可选"是标识符.

一方面,我希望有一个类似于Lex的规则optional { return OPTIONAL; },以后会在YACC中使用,例如:

optional : OPTIONAL identifier '=' expression ;
Run Code Online (Sandbox Code Playgroud)

如果我然后定义identifier为,说:

identifier : OPTIONAL | FIXED32 | FIXED64 | ... /* couple dozens of keywords */ 
    | IDENTIFIER ;
Run Code Online (Sandbox Code Playgroud)

它只是感觉很糟糕...此外,我需要两种标识符,一种用于何时允许关键字作为标识符,另一种用于何时不是...

有没有习惯的方法来解决这个问题?

parsing yacc lex

5
推荐指数
1
解决办法
373
查看次数

什么时候使用 Py_INCREF?

我正在开发一个 C 扩展,现在我想追踪内存泄漏。通过阅读 Python 的文档,很难理解何时增加/减少 Python 对象的引用计数。此外,在花了几天时间尝试嵌入 Python 解释器(为了将扩展编译为独立程序)之后,我不得不放弃这项努力。所以,像 Valgrind 这样的工具在这里是无能为力的。

到目前为止,通过反复试验,我了解到,例如,这Py_DECREF(Py_None)是一件坏事……但这是否适用于任何常数?我不知道。

到目前为止,我的主要困惑可以这样列出:

  1. PyWhatever_New()如果它不超过创建它的程序,我是否必须减少它创建的任何东西的refcount?
  2. 每个都Py_INCREF需要与 匹配Py_DECREF,还是应该有一个/另一个?
  3. 如果对 Python 过程的调用导致 a PyObject*,我是否需要增加它以确保我仍然可以使用它(永远),或者减少它以确保最终它会被垃圾收集,或者两者都不需要?
  4. Python 对象是通过 C API 在堆栈上还是堆上分配的堆栈上创建的?(例如,有可能Py_INCREF在堆上重新分配它们)。
  5. 在将它们传递给 Python 代码之前,我需要对在 C 代码中创建的 Python 对象做任何特殊的事情吗?如果 Python 代码比创建 Python 对象的 C 代码寿命长会怎样?
  6. 最后,我明白 Python 既有引用计数又有垃圾收集器:如果是这样的话,如果我把引用计数弄乱了(即递减得不够),GC 最终会弄清楚如何处理这些对象吗?

python memory-management cpython

5
推荐指数
1
解决办法
1295
查看次数

如何在 Maxima 中计算对数?

以下是这里的示例,我在这里尝试过:

log2(x) := log(x) / log(2);
log2(8), float;
Run Code Online (Sandbox Code Playgroud)

但这并没有给出 3,而是得到log(8)/log(2)

logarithm maxima

4
推荐指数
1
解决办法
4066
查看次数

如何为asyncio创建自定义传输?

我正在阅读包中的文档ProtocolTransportasyncio.特别:

子类化协议类时,建议您覆盖某些方法.这些方法是回调:它们将由传输在某些事件上调用(例如,当收到某些数据时); 你不应该自己打电话,除非你正在实施运输.

强调补充说

因此,原则上应该可以实现运输,但......

传输是asyncio提供的类,用于抽象各种通信信道.您通常不会自己实例化运输; 相反,您将调用一个AbstractEventLoop方法 (哪一个?),它将创建传输并尝试启动底层通信通道,并在成功时回拨您.

再次强调了重点

阅读关于AbstractEventLoop的部分,我没有看到任何创建自定义传输的方法.它最接近的AbstractEventLoop.create_connection(protocol_factory, host=...)只是暗示它会创造某种插座......

好吧,我的最终目标是使用一个自定义传输,它不是任何类型的套接字(也许StringIO是一个数据库连接游标,也许是另一种协议).


那么,这只是一个很好的但是从未在文档中实现过的错误,或者实际上是否有一种方法可以实现自定义传输而无需修补猴子asyncio并牺牲第一胎?

python python-asyncio

4
推荐指数
1
解决办法
728
查看次数

如何在Sphinx样式的文档字符串中插入突出显示或代码块?

例如:

def foo():
    '''
    .. highlight:: python
    import sys
    '''
Run Code Online (Sandbox Code Playgroud)

不产生所需的输出(它逐字打印单词“ highlight”,并且不以任何特殊方式格式化以下代码)。也会发生同样的情况code-block

我尝试了不同的缩进等。无论如何,生成器以大致相同的方式成功,但未获得所需的输出。

python documentation python-sphinx

4
推荐指数
1
解决办法
2707
查看次数

没有为侦听器 PLAINTEXT://:TCP 定义安全协议

 Error creating broker listeners from 'PLAINTEXT://:tcp://10.99.149.156:9092': No security protocol defined for listener PLAINTEXT://:TCP
Run Code Online (Sandbox Code Playgroud)

这是完整的消息

这看起来像糟糕的配置。我认为它不应该同时是“纯文本”和“tcp”。这个配置可能来自哪里?这个 Kafka 来自wursmeister/kafkaDocker 镜像。这一直有效到大约一周前。但我不知道它究竟在多久前发生了变化,因为 Docker 并没有真正允许跟踪版本/缓存管理非常差。

apache-kafka docker

4
推荐指数
1
解决办法
7411
查看次数

Django 加载什么模板?

我正在关注 Django 教程,并被困在它要求我用我自己的模板替换网站管理部分的默认模板的地方。问题是模板名称中的拼写错误。我怀疑肯定存在这样的问题,但是为了解决该问题,查看 Django 的某种报告以了解它用于呈现特定页面的模板会非常有帮助。有什么办法可以做到这一点吗?

python django django-templates

3
推荐指数
1
解决办法
516
查看次数

CI 作业中的嵌套阶段

在 GitLab 作业描述中,可以指定阶段,其中作业将按阶段分组并并行执行。想象一下我想要执行以下操作:

  1. 构建发布二进制文件。
  2. 为发布二进制文件构建发布 Docker 映像。
  3. 构建调试二进制文件。
  4. 为调试二进制文件构建调试 Docker 映像。

由于没有嵌套阶段,我可以尝试同时构建发布和调试二进制文件,然后构建两个映像。但是,这是非常低效的,因为其中一个构建比另一个构建花费的时间要长得多,但是,我无法开始为先完成的构建创建图像。

如果能够安排 Docker 镜像构建工作在第一个构建完成后立即开始,那就完美了。一种可能的方法是,如果我可以指定嵌套阶段,其中,阶段build-all有两个嵌套阶段:build-releasebuild-debug,每个阶段由两个作业组成:build-release-binary, build-release-image, 以及类似的build-debug-binary, build-debug-image

由于我是 GitLab 的新手,我也希望得到否定的答案,即知道这是不可能的也很有用。

continuous-integration gitlab gitlab-ci

3
推荐指数
1
解决办法
3691
查看次数

在GitLab CI脚本中克隆另一个GitLab存储库

我已经看到了:gitlab-ci.yml中的“ git clone project2”?以及类似答案的类似帖子,暗示一个人应该使用Git子模块。

在我的案例中,如果不讨论有关Git中的子模块是否工作正常的争论,那根本就不是一个选择(要检查的其他项目取决于传递给作业触发器的论点,或者至少取决于它。应该)。

另一个要求是,我需要能够跟踪启动触发器链的用户。即,对我的个人令牌进行硬编码,或者只是任何令牌都不会这样做:我需要GitLab来使用执行作业的用户的权限才能克隆其他存储库。

除了放弃GitLab并寻找成熟的CI替代方案之外,还有什么方法可以做到这一点?

gitlab

2
推荐指数
2
解决办法
3380
查看次数

SQLAlchemy不映射反射类

我有这个代码:

def advertiser_table(engine):
    return Table('advertiser', metadata, autoload=True, autoload_with=engine)
Run Code Online (Sandbox Code Playgroud)

后来我试试这个:

advertisers = advertiser_table(engine)
...
session.bulk_insert_mappings(
        advertisers.name,
        missing_advetisers.to_dict('records'),
    )
Run Code Online (Sandbox Code Playgroud)

missing_adverisers熊猫在哪里DataFrame(但对于这个问题并不重要).

这给我的错误是:

sqlalchemy.orm.exc.UnmappedClassError: Class ''advertiser'' is not mapped
Run Code Online (Sandbox Code Playgroud)

从阅读文档中我可以争先恐后地提出这个问题,但不仅仅是那个......这是什么Mapper以及为什么它对这个库的功能如此不利?为什么"类"没有映射?显然,我该怎样做才能将它"映射"到这个图书馆想要映射的内容?

python reflection sqlalchemy

0
推荐指数
1
解决办法
390
查看次数

线程安全/可重入的野牛+弹性

我真的更喜欢一个有效的例子来解释.无论我到目前为止在Bison的文档网站上所阅读的内容都与Flex所说的相矛盾.有人说要宣布yylex

int yylex (yyscan_t yyscanner);
Run Code Online (Sandbox Code Playgroud)

另一个人希望它是:

int yylex(YYSTYPE *lvalp, YYLTYPE *llocp);
Run Code Online (Sandbox Code Playgroud)

我真正需要的是位置信息.我现在还不确定是否需要YYSTYPE(我现在没有使用这些信息,但将来我可能会这样做).


与上述无关,作为奖励,我很有兴趣知道为什么这个基础设施如此糟糕.这似乎是一件非常直截了当的事情,但它却非常糟糕.它从不适用于默认值.即使编写一个最简单的教科书计算器示例,也需要多天修复配置错误...为什么?

yacc bison flex-lexer

0
推荐指数
1
解决办法
1475
查看次数