【问题标题】:How to ensure only single process running in Thread如何确保只有单个进程在线程中运行
【发布时间】:2017-08-07 06:09:33
【问题描述】:

我有一个协程类型的类方法,并且从一个用户同时收到多个请求,假设用户在 t =0 进行函数调用,并且函数需要 10 毫秒的进程,用户进行另一个在 t= 3 ms 时进行异步调用,然后在 t = 10 ms 时响应请求 1 并在 t = 20 ms 时响应请求 2,因此请求 2 的周转时间为 17 ms,但是我想要以下场景,

如果请求 1 在 t = 0 ms 来自一位用户,并且在请求 2 在 t = 3ms 进入之前运行了 3 ms,则必须销毁调用 1 并开始调用响应 2,并响应 request2必须在 t=13ms 时返回,周转时间为 10 毫秒。

类似于确保为每个用户运行单个进程。 所以如果有一个函数

  def Myfunction(a,b):
     return a+b

  #user calls
  #at t = 0
  myfunction(10,5) #takes 10 ms

  #at t=3 
  myfunction(100,200)#takes 10 ms

  so  i want that myfunction must have only single/latest call  instance running  for each user i.e in above case only myfunction(100,200) my be occupying the the CPU after t=3 .

我正在使用 python asyncio 库并从语句和事件循环中产生。

请提供一些想法如何实现上述想法。

【问题讨论】:

  • 只是为了确定,等待用户响应启动一个线程,然后如果用户再次调用相同的东西并重新启动它,你想销毁该线程吗?
  • 是的,如果用户再次调用相同的东西来清空 CPU 进行新调用,我想销毁该线程
  • 您知道您的代码不会创建新线程吗?
  • 在 asyncio 中,进程在单个事件循环中运行,该循环在单个线程中运行,但是我尝试创建新的事件循环并在调用函数时在其中显式调用此函数,但是在这种情况下也是我在同步函数调用响应中遇到了延迟。

标签: python operating-system python-asyncio


【解决方案1】:

在 asyncio 中,您将使用任务来处理此问题。您跟踪当前正在运行的函数,并在再次调用时取消它

_running = None
async def wrapped_myfunction():
    global _running
    if _running is not None:
        _running.cancel()
    _running = asyncio.create_task(myfunction())
    return await _running

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-09-27
    相关资源
    最近更新 更多