小编ptb*_*ptb的帖子

使用带有 c++20 概念的 clang-format

我查看了 clang-format 样式选项https://clang.llvm.org/docs/ClangFormatStyleOptions.html但没有看到任何对 c++ 概念和需要子句的引用。通常我可以配置 clang-format 来做我想做的事,但我不知道如何让它很好地处理我的概念和需要条款:

  1. 目前 clang-format 对我的概念做了这个:
template <typename F, typename P, typename T>
concept Accumulate_Fn = Parser<P>&& std::invocable<F, T, parser_t<P>>&&
    std::same_as<T, std::invoke_result_t<F, T, parser_t<P>>>;
Run Code Online (Sandbox Code Playgroud)

但是我想将每个约束放在自己的行上(就像它处理太长的函数参数一样),以便结果如下所示:

template <typename F, typename P, typename T>
concept Accumulate_Fn = Parser<P> &&
                        std::invocable<F, T, parser_t<P>> &&
                        std::same_as<T, std::invoke_result_t<F, T, parser_t<P>>>;
Run Code Online (Sandbox Code Playgroud)
  1. 对于带有 requires 子句的函数,clang-format 目前给了我:
template <Parser P1, Parser P2, typename T, Accumulate_Fn<P1, parser_t<P1>> F>
requires std::same_as<T, parser_t<P1>> constexpr Parser auto
separated_by(P1&& p1, P2&& p2, T&& init, F&& f)
Run Code Online (Sandbox Code Playgroud)

但我想要更接近的东西: …

c++-concepts clang-format c++20

17
推荐指数
1
解决办法
1286
查看次数

PyErr_CheckSignals 未拾取信号

我有一个 C 扩展,它实现了 LRU 缓存https://github.com/pbrady/fastcache。我最近注意到,在一个大量使用缓存的应用程序(SymPy)中,超时信号丢失,而应用程序继续运行。仅当使用我的 C 扩展而不是使用纯 Python LRU 缓存(即 functools.lru_cache)时才会发生这种情况https://github.com/pbrady/fastcache/issues/26

我在例程中添加了对 PyErr_CheckSignals() 的调用,信号丢失的频率降低了,但这种情况仍然会发生。请注意,在调用期间,缓存将调用 PyObject_Hash、PyDict_Get/Set/DelItem 和 PyObject_Call(在未命中的情况下)。

这是 SymPy 代码的相关片段(超时是一个整数):

def _timeout(self, function, timeout):
    def callback(x, y):
        signal.alarm(0)
        raise Skipped("Timeout")
    signal.signal(signal.SIGALRM, callback)
    signal.alarm(timeout)  # Set an alarm with a given timeout
    function()
    signal.alarm(0)  # Disable the alarm    enter code here
Run Code Online (Sandbox Code Playgroud)

有什么东西会覆盖信号吗?如果是这样,我该如何解决这个问题?

c python signals python-c-api python-c-extension

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

启动mpi进程时,Slime\Emacs comint挂起

我有一个简单的mpi程序来演示我的问题:

#include <stdio.h>
#include <mpi.h>

int main(int argc, char *argv[])
{
    int rank, csize;

    MPI_Init(&argc, &argv);
    MPI_Comm_rank(MPI_COMM_WORLD, &rank);
    MPI_Comm_size(MPI_COMM_WORLD, &csize);

    printf("Hello from rank[%d/%d]\n", rank, csize);

    MPI_Finalize();
}
Run Code Online (Sandbox Code Playgroud)

编译之后,我可以使用mpirunsbcl repl 成功启动可执行文件:

* (uiop:run-program '("mpirun" "-np" "10" "./hello_world") :output :string)

"Hello from rank[7/10]
Hello from rank[9/10]
Hello from rank[5/10]
Hello from rank[8/10]
Hello from rank[0/10]
Hello from rank[1/10]
Hello from rank[2/10]
Hello from rank[3/10]
Hello from rank[4/10]
Hello from rank[6/10]
"
NIL
0
Run Code Online (Sandbox Code Playgroud)

然而,当我从粘液中运行时,粘液重复只是挂起.如果我直接运行可执行文件,而不是通过mpirun启动程序,那么一切运行正常:

CL-USER> (uiop:run-program '("./hello_world")
               :output …
Run Code Online (Sandbox Code Playgroud)

emacs sbcl common-lisp slime mpi

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