如何(gevent)生成任务而不等待它加入

时间:2017-06-17 10:59:50

标签: python scheduled-tasks scheduler gevent

我写了一个问题的示例代码。我正在生成一个随机字符串和一个shuffle函数,它会为消息添加一个延迟,以便它以不同的顺序出现。

但是,计划任务仅在我最后joinall时执行。有没有办法在动态调度新的产生时执行调度和任务。当我一直按下回车键时,它会安排一个新任务但是在我达到我设置的随机条件之前它不会执行。但是,如果我在追加后放join/joinall,它就会阻止。这可能与gevent或其他任何库可以用任何其他异步I / O或非阻塞库完成,或者我是否必须求助于多线程。

#!/usr/bin/python
import random 
import string
from gevent import sleep, spawn, joinall

def random_string():
    digits = "".join( [random.choice(string.digits) for i in xrange(8)] )
    chars = "".join( [random.choice(string.letters) for i in xrange(10)] )
    return chars

def delay_message(message, delay):
    sleep(delay)
    print("Shuffled message: {} and time: {}". format(message, delay))

def main():
    while True:
        s = raw_input("Please continue pressing enter, messages will appear when they are ready")
        if s == "":
            delay = random.randint(0, 10)
            string = random_string()
            print("Message: {} and time: {}". format(string, delay))
            tasks = []
            tasks.append(spawn(delay_message, string, delay))

            if (random.randint(0,10) == 5): # random condition in breaking
                joinall(tasks, raise_error=True)
                break
        else:
            print("Exiting")
            break

if __name__ == "__main__":
    main()

2 个答案:

答案 0 :(得分:0)

我找到了一个解决方案:使用ThreadPool,例如在循环外部分配的Global.asax并移除tasks = ThreadPool(25)tasks=[]

此外,添加joinall()然后在休息之前的while循环中随机条件中添加from gevent import wait,以便现有任务可以在退出程序之前完成

答案 1 :(得分:0)

具体而言,无论您是否加入,工作都将完成,您只需要在确保工作完成之前加入以确保并发性,您可以使用许多方法来获取状态继续(队列,共享变量,回调,委托方法),因为你使用的是greenlets,你甚至不需要像添加数字那样锁定原子操作,因为它们发生在同一个线程上。