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

How to (gevent) spawn tasks without waiting for it to join

我已经写了我的问题的示例代码。我正在生成一个随机字符串和一个随机播放函数,它为消息增加了延迟,因此它以不同的顺序出现。

但是,计划任务只在我有 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()

我找到了一个解决方案:使用线程池,例如tasks = ThreadPool(25) 在循环外分配并删除 tasks=[]joinall()

另外,在break之前的while循环中的随机条件中加入from gevent import wait然后加入wait(),这样在程序退出之前,已有的任务可以完成

特别是无论你是否加入,工作都会完成,你只需要在你需要确保工作完成后再加入以确保并发性,你可以使用很多方法来获取状态你正在进行(队列、共享变量、回调、委托方法),因为你使用的是 greenlets,你甚至不需要锁定原子操作,比如添加数字,因为它们发生在同一个线程上。