简体   繁体   English

使用 gevent Greenlets 时的奇怪行为

[英]Weird behavior while using gevent Greenlets

I am new to async programming.我是异步编程的新手。 I am doing a small POC where I want to see how greenlets behave with shared objects.我正在做一个小的 POC,我想看看greenlets如何处理共享对象。 I have written this code -我写了这段代码 -

from gevent import monkey, sleep
from gevent import Greenlet
monkey.patch_all(thread=False, socket=False)

class Events:
    def __init__(self):
        self.num = 0
        self.limit = 10
        self.bulk_records = []

    def start(self, task_number=0):
        count = 0
        print("Task: %s started" % task_number)
        while count != 10:
            self.bulk_records.append(task_number)
            sleep(0.1)
            if len(self.bulk_records) == self.limit:
                print("%s, Task %s, outputting list: %s" % (self.num, task_number, self.bulk_records))
                self.bulk_records[:] = []
                self.num += 1
            count += 1
        print("Task - %s, count - %s" % (task_number, count))

def run_test():
    event = Events()
    tasks = [Greenlet.spawn(event.start, i) for i in range(5)]
    print("Num tasks - %s" % len(tasks))
    [task.run() for task in tasks]
    print("End")

if __name__ == '__main__':
    run_test()

It gives the following output:-它提供以下输出:-

Num tasks - 5
Task: 0 started
Task: 1 started
Task: 2 started
Task: 3 started
Task: 4 started
0, Task 0, outputting list: [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]
1, Task 0, outputting list: [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]
2, Task 0, outputting list: [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]
3, Task 0, outputting list: [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]
4, Task 0, outputting list: [0, 1, 2, 3, 4, 0, 1, 2, 3, 4]
Task - 0, count - 10
Task: 1 started # This is not expected
Task - 1, count - 10
Task - 2, count - 10
Task - 3, count - 10
Task - 4, count - 10
5, Task 1, outputting list: [1, 1, 1, 1, 1, 1, 1, 1, 1, 1]
Task - 1, count - 10
End

Process finished with exit code 0

The code works as expected but in the end something weird happened, Task 1 is started again and the corresponding function start is executed again.代码按预期工作,但最后发生了一些奇怪的事情,任务 1 再次start ,相应的函数start再次执行。

Not sure if this is a valid behavior, or what I am missing in the code to prevent Greenlet to start again.不确定这是否是有效行为,或者我在代码中缺少什么以防止Greenlet重新启动。

Thanks is advance谢谢是提前

Contrary to the thread API, which requires a thread object to be created and to call the start() method, gevent.spawn does both greenlet instantiation and schedules the greenlet to run in one call.与线程 API 不同,它需要创建一个线程对象并调用start()方法, gevent.spawn执行 greenlet 实例化并安排 greenlet 在一次调用中运行。

So, calling run() on greenlet objects is not needed (and probably very wrong in most cases).因此,不需要在 greenlet 对象上调用run() (并且在大多数情况下可能是非常错误的)。

Waiting for tasks to be completed is done with joinall(list of greenlets) .等待任务完成是通过joinall(list of greenlets) After this call, all greenlets are ready (dead, successfully or not).在这个调用之后,所有的 greenlet 都准备好了(死了,成功与否)。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM