Использование событий Pyramid и многопоточности - PullRequest
0 голосов
/ 28 апреля 2020

Я хотел бы использовать подписку / уведомление о событиях вместе с многопоточностью. Похоже, что это должно просто работать в теории, и документация не содержит никаких предупреждений. События должны быть синхронными, поэтому и отсрочки не должно быть.

Но на практике, когда я уведомляю о выходе из основного потока, ничего не происходит:

def run():
    logging.config.fileConfig(sys.argv[1])
    with bootstrap(sys.argv[1]) as env:
        get_current_registry().notify(FooEvent())  # <- works
        Thread(target=thread).start()              # <- doesn't work

def thread():
    get_current_registry().notify(FooEvent())

Это не должно работать? Или я что-то не так делаю?

1 Ответ

0 голосов
/ 04 мая 2020

Просто ли контекст 'with' применяется к оператору создания Thread () только и не распространяется на метод thread (). т. е. в случае, если работает, вызов get_current_registry имеет значение с контекстом env, но этот контекст с контекстом не будет распространяться на точку, в которой поток запускает get_current_registry. Поэтому вам нужно распространить env в thread () - возможно, создав простой исполняемый класс, который принимает env в методе init.

class X:
    def __init__(self,env):
        self.env = env

    def __call__(self):
        with self.env:
            get_current_registry().notify(FooEvent())
        return

def run():
    logging.config.fileConfig(sys.argv[1])
    with bootstrap(sys.argv[1]) as env:
        get_current_registry().notify(FooEvent())
        Thread(target=X(env)).start()
...