小编Nic*_*ous的帖子

调用 thread.join() 是否会阻塞异步上下文中的事件循环?

我正在使用aiohttp实现一个 Web API ,并使用启用了 UVloop 的Gunicorn--worker-class aiohttp.GunicornUVLoopWebWorker进行部署。因此,我的代码始终在异步上下文中运行。我的想法是在处理请求时实现并行作业以获得更好的性能。

我不使用是asyncio因为我想要Parallelism,而不是Concurrency

我知道python 中的多处理GIL 问题。但加入流程也适用于我的问题。

这是一个例子:

from aiohttp.web import middleware

@middleware
async def context_init(request, handler):
    request.context = {}
    request.context['threads'] = []
    ret = await handler(request)
    for thread in request.context['threads']:
        thread.join()
    return ret
Run Code Online (Sandbox Code Playgroud)

考虑到thread.join()orprocess.join()阻止当前线程,这将阻止事件循环(据我所知)。如何异步加入?我想要的可以形象地表示为:await thread.join()await process.join()

更新:

感谢@user4815162342,我能够为我的项目编写正确的代码:

中间件:

from aiohttp.web import middleware
from util.process_session import ProcessSession

@middleware
async def context_init(request, handler): …
Run Code Online (Sandbox Code Playgroud)

python multithreading python-asyncio

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

将OpenCV Mat转换为Texture2D?

元语境:

我目前正在开发一款利用opencv替代普通输入(键盘,鼠标等)的游戏.我通过DllImports在C++中使用Unity3D的C#脚本和opencv.我的目标是在我的游戏中创建一个来自opencv的图像.

代码上下文:

正如通常在OpenCV中所做的那样,我使用Mat来表示我的图像.这是我导出图像字节的方式:

cv::Mat _currentFrame;

...

extern "C" byte * EXPORT GetRawImage()
{
    return _currentFrame.data;
}
Run Code Online (Sandbox Code Playgroud)

这就是我从C#导入的方式:

[DllImport ("ImageInputInterface")]
private static extern IntPtr GetRawImage ();

...

public static void GetRawImageBytes (ref byte[] result, int arrayLength) {
    IntPtr a = GetRawImage ();
    Marshal.Copy(a, result, 0, arrayLength);
    FreeBuffer(a);
}
Run Code Online (Sandbox Code Playgroud)

从我理解OpenCV的方式来看,我希望在uchar指针中序列化时,以这种方式构造字节数组:

b1, g1, r1, b2, g2, r2, ...
Run Code Online (Sandbox Code Playgroud)

我正在使用以下方法将此BGR数组转换为RGB数组:

public static void BGR2RGB(ref byte[] buffer) {
    byte swap;
    for (int i = 0; i < buffer.Length; i = i + 3) { …
Run Code Online (Sandbox Code Playgroud)

c# c++ opencv unity-game-engine

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