多处理:如何确定作业是在等待还是已提交?

时间:2016-08-07 14:44:16

标签: python multiprocessing

背景

  • 等待代表的不同类型作业的小型服务器 作为Python函数(下面的示例代码中的async_funcasync_func2)。
  • 每个作业都会以Pool提交给apply_async并花费不同的时间,即我无法确定首先提交的作业是否也会完成
  • 我可以使用.get(timeout=0.1)
  • 检查作业是否已完成

问题

如何检查作业是否仍在队列中等待还是已在运行?

使用Queue正确的方式还是有更简单的方法?

代码

import multiprocessing
import random
import time

def async_func(x):
    iterations = 0
    x = (x + 0.1) % 1
    while (x / 10.0) - random.random() < 0:
        iterations += 1
        time.sleep(0.01)
    return iterations

def async_func2(x):
    return(async_func(x + 0.5))

if __name__ == "__main__":
    results = dict()
    status = dict()
    finished_processes = 0
    worker_pool = multiprocessing.Pool(4)
    jobs = 10
    for i in range(jobs):
        if i % 2 == 0:
            results[i] = worker_pool.apply_async(async_func, (i,))
        else:
            results[i] = worker_pool.apply_async(async_func2, (i,))
        status[i] = 'submitted'
    while finished_processes < jobs:
        for i in range(jobs):
            if status[i] != 'finished':
                try:
                    print('{0}: iterations needed = {1}'.format(i, results[i].get(timeout=0.1)))
                    status[i] = 'finished'
                    finished_processes += 1

                except:
                    # how to distinguish between "running but no result yet" and "waiting to run"
                    status[i] = 'unknown'

1 个答案:

答案 0 :(得分:1)

只需将状态字典发送到函数,因为dicts是可变的,你需要做的就是更改你的函数:

def async_func2(status, x):
    status[x] = 'Started'
    return(async_func(x + 0.5))

当然,您可以在致电apply_async

之前将状态更改为待处理状态