小编The*_*eJJ的帖子

迭代asyncio.coroutine

我最近一直在使用asyncio,虽然我开始对它的工作原理有所了解,但我还是无法做到.我不确定是不是因为我的构造错误了,或者有什么理由说我为什么要做的事情没有意义.

简而言之,我希望能够迭代一个让步的asyncio.coroutine.例如,我希望能够做到这样的事情:

@asyncio.coroutine
def countdown(n):
    while n > 0:
        yield from asyncio.sleep(1)
        n = n - 1
        yield n

@asyncio.coroutine
def do_work():
    for n in countdown(5):
        print(n)

loop.run_until_complete(do_work())
Run Code Online (Sandbox Code Playgroud)

然而,这引起了asyncio的一个例外.我尝试了其他的东西,for n in (yield from countdown(5)): ...但是它也提供了类似的不透明的运行时异常.

我不能立即明白为什么你不应该做这样的事情,但是我已经达到理解正在发生的事情的极限.

所以:

  • 如果可以这样做,我该怎么办?
  • 如果不可能,为什么不呢?

如果这个问题不清楚,请告诉我!

python python-3.4 python-asyncio

8
推荐指数
1
解决办法
1906
查看次数

Python 3.3 C字符串处理(wchar_t vs char)

我正在尝试在我们的C++项目中嵌入Python 3.3.Python 3.3似乎已经引入了UTF-8作为首选存储,PEP 393:"规范选择UTF-8作为向C代码公开字符串的推荐方式."

我写了这个初始化代码,看似简单直观:

#include <Python.h>
#include "log.h"

void python_init(const char *program_name) {
    if (not Py_IsInitialized()) {
        Py_SetProgramName(program_name);
        Py_Initialize();
        const char *py_version = Py_GetVersion();
        log::msg("initialized python %s", py_version);
    }
}
Run Code Online (Sandbox Code Playgroud)

但编译失败:

/home/jj/devel/openage/src/engine/python.cpp:13:3: error: no matching function for call to 'Py_SetProgramName'
                Py_SetProgramName(program_name);
                ^~~~~~~~~~~~~~~~~
/usr/include/python3.3/pythonrun.h:25:18: note: candidate function not viable: no known conversion from 'const char *' to 'wchar_t *' for 1st argument
PyAPI_FUNC(void) Py_SetProgramName(wchar_t *);
                 ^
Run Code Online (Sandbox Code Playgroud)

所以,是的,显然我需要一个wchar_t *,但我没有看到任何理由为什么char *不在这里做这个工作.

这里的最佳做法是什么?转换char *wchar …

c c++ python api python-3.x

7
推荐指数
1
解决办法
1244
查看次数

libuv 中 sd-bus 的事件循环处理

我们有一个事件循环来libuv处理 unixsockets 和 TCP 套接字。sd-bus该程序现在还必须处理 DBus,我们决定为此使用。

伦纳特在他的博客上写道

Note that our APIs, including sd-bus, integrate nicely into sd-event
event loops, but do not require it, and may be integrated into other
event loops too, as long as they support watching for time and I/O events.
Run Code Online (Sandbox Code Playgroud)

所以我认为,这一定是可能的。

fd我可以通过获取 dbus 套接字sd_bus_get_fd (sd_bus *bus)。但我找不到任何明显的方法来阻止 sd-bus 使用其bus_poll方法在内部等待事件。

例如,当调用方法时,sd_bus_call(...) 阻塞ppoll

那么:如何处理 libuv 中的 dbus 事件?

c++ dbus libuv systemd

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

标签 统计

c++ ×2

python ×2

api ×1

c ×1

dbus ×1

libuv ×1

python-3.4 ×1

python-3.x ×1

python-asyncio ×1

systemd ×1