用于阻止呼叫的多处理龙卷风

时间:2018-04-27 07:06:16

标签: multithreading asynchronous multiprocessing tornado

我有一个请求,我必须在龙卷风服务器中进行阻塞调用,我不希望主线程因任何原因被阻止。所以我想我会在不同的线程/进程中运行它。

存根代码如下:

public async Task<IActionResult> OnGetAsync(int? id) {

                List1 = await _dbcontext.tbl1.ToListAsync();
                List2 = await _dbcontext.tbl2.ToListAsync();
                List3 = await _dbcontext.tbl3.ToListAsync();
                List4 = await _dbcontext.tbl4.ToListAsync();
    }
  1. 如果我在不同的线程中运行它,那么python的GIL会在执行阻塞线程时阻塞主线程吗?
  2. 使用多处理而不是多线程有什么好处?
  3. 如果我必须在龙卷风中使用多处理怎么做?
  4. 如果我希望阻塞代码从队列中获取值,请处理它们并在主线程中调用该函数,我该如何实现它。

1 个答案:

答案 0 :(得分:1)

  1. 是的,它会阻塞主线程,但最大间隔为1000字节码命令或15毫秒(如果我没记错的话)。之后,解释器将在线程之间切换。但解释器非常聪明,IO操作(和C-lib调用)根本不会阻塞,所以对于解释器,如果time.sleep(2)在一个单独的线程中运行,则意味着它将返回到主线程~2秒后再切换回来。对于IO来说也是如此:如果您从一个巨大的文件中file.read()(或从队列中等待),它将在读取完成后切换到该线程。
  2. This question has been answered already
  3. 在你的情况下,你不需要那个。只需将队列读取移动到另一个具有executor的线程。这就是Tornado工作的异步数据库驱动程序的数量。
  4. 见3.