如何使greenlets任务按异步I/O的正确顺序出现?

2024-04-26 11:48:52 发布

您现在位置:Python中文网/ 问答频道 /正文

我又写了一个问题的示例代码。我有一个测试用例,其中最大的时间延迟将与其随机字符串一起获取。 例如[1,2,7,2,1,2,8,1]会来[1,2,7,7,7,7,8,8]

它正在工作,但它没有在正确的顺序,因为在7的随机字符串的输出是随机的。我已经使用了wait(),但我不明白为什么它在生成greenlet时不处理greenlet。我试过使用tasks = ThreadPool()tasks = []

#!/usr/bin/python
import random
import string
from gevent import sleep, spawn, wait
from gevent.threadpool import ThreadPool
import time 

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 shuffle_message (message, delay):
    sleep(delay)
    print("Shuffled message: {} and time: {}". format(message, delay))

def main():
    tasks = ThreadPool(25)
    prev = 0
    a=[1,2,7,2,1,2,8,1] #test case but it is randomise normally

    for i, elem in enumerate(a):
        delay = a[i]
        string = random_string()
        print("Message: {} and time: {}". format(string, delay))

        if prev < delay: 
            prev = delay
        else:
            delay = prev 
        print("New message: {} and time: {}". format(string, delay))
        tasks.spawn(shuffle_message, string, delay)
    wait()

if __name__ == "__main__":
    main()

Tags: andinimportmessageforstringtimedef