我在 Django 视图中执行了几个 Celery 任务(更具体地说,在 Django Rest Framework 的perform_create方法中)。
我想要实现的是立即(即,一旦任务在结果后端中有一个 id/is)访问该TaskResult对象并对其执行某些操作,如下所示:
tasks = [do_something.s(a) for a in (1, 2, 3, 4,)]
results = group(*tasks).apply_async()
for result in results.children:
task = TaskResult.objects.get(task_id=result.task_id)
do_something_with_task_object(task)
Run Code Online (Sandbox Code Playgroud)
现在,这失败了django_celery_results.models.DoesNotExist: TaskResult matching query does not exist。
我还没有尝试过,但我可以使用以下代码片段来完成这项工作。但这在我看来是完全错误和丑陋的,它是否还要等到任务完成:
while not all([TaskResult.objects.filter(task_id=t.task_id).exists() for t in results.children]):
pass
Run Code Online (Sandbox Code Playgroud)
有什么方法可以使这项工作以一种漂亮而干净的方式工作吗?
我刚刚开始熟悉Cython,试图将一些C语言结构包装到Python方法和类中.我真正不了解的是如何从(初始化的)C结构转换到相应的Python类应该可行.我在这里想念的是什么:
C头文件的片段:
struct test_struct {
int _something;
complex_struct* _another;
};
typedef struct test_struct test;
test *test_new(void);
int some_method(test **n, int irrelevant);
Run Code Online (Sandbox Code Playgroud)
来自我的.pxd的相应片段:
cdef struct test_struct:
pass
ctypedef test_struct test
test* test_new()
int some_method(test **n, int irrelevant)
Run Code Online (Sandbox Code Playgroud)
我的.pyx:
def do_something(int irrelevant):
cdef test* t = test_new()
ret = some_method(&t, irrelevant)
# Here comes the problem...
return <Test?>t
cdef class Test:
cdef test* _t
# cinit here and some methods here. No members except _t
Run Code Online (Sandbox Code Playgroud)
返回声明的所有内容都可以正常工作.我得到一个正确的值ret,等等.但返回语句中的强制转换似乎不正确或缺少更多信息.发出t = do_something(42)Python段错误时. …