Проблема создания повторяющихся потоков Gevent из списка - PullRequest
0 голосов
/ 03 октября 2019

Я борюсь с правильным синтаксисом для создания потоков Gevent из списка. Я хочу, чтобы эти темы повторялись бесконечно в определенной каденции, если они не остановлены. Запускается только первый элемент списка. Из документации я подумал, что gevent.sleep заставил процесс уступить другому потоку. Я ожидаю, что rule1 будет повторяться каждую секунду, а rule2 будет повторяться каждые две секунды. Что я пропустил? Заранее спасибо.

import gevent
import datetime

def repeat(name: str, timer: float):
    while True:
        print(name + ': ' + str(datetime.datetime.now()))
        gevent.sleep(timer)

threads = []
rules = [
    {'name': 'rule1', 'timer': 1.0},
    {'name': 'rule2', 'timer': 2.0}
]

for rule in rules:
    threads.append(gevent.spawn(repeat(rule['name'], rule['timer'])))

gevent.joinall(threads)

Работает, как и ожидалось, когда я создаю отдельные процессы для правила 1/2 и добавляю их в потоки. Похоже, что проблема находится в разделе «для правила в правилах», но я не уверен, как заставить его пройти мимо первого правила.

У меня та же проблема, что и у автора Задача Gevent с бесконечным циклом, кажется, также блокирует все остальные задачи , но их решение заключалось в том, чтобы включить функцию gevent.sleep в их цикл, который у меня уже есть ...

1 Ответ

0 голосов
/ 04 октября 2019

Рассматривал различия между моим решением и тем, которое я связал выше. Для любого в одной лодке это было связано с классами! Я переместил функцию повтора в класс, создал пару экземпляров и добавил их в список, и это сработало.

import gevent
import datetime


class Rule:
    def __init__(self, name: str, timer: float):
        self.name = name
        self.timer = timer

    def repeat(self):
        name = self.name
        timer = self.timer
        while True:
            print(name + ': ' + str(datetime.datetime.now()))
            gevent.sleep(timer)


rule1 = Rule('rule1', 2.0)
rule2 = Rule('rule2', 1.0)
testlist = [rule1, rule2]
threads = []

for rule in testlist:
    threads.append(gevent.spawn(rule.repeat))

gevent.joinall(threads)
...