Python не может на некоторое время остановить l oop в сопрограмме - PullRequest
0 голосов
/ 02 апреля 2020

Я хочу динамически управлять пауком извне, например, добавить или остановить, Как это исправить?

, а также в процессе класс определение self._l oop = asyncio.get_event_l oop () после стартового рейза:

File "Python38\lib\multiprocessing\spawn.py", line 102, in spawn_main
    source_process = _winapi.OpenProcess(
OSError: [WinError 87] The parameter is incorrect

Почему?

Моя платформа Windows.

import asyncio
from multiprocessing import Process


class Spider(Process):
    def __init__(self):
        super().__init__()
        self._stopped = False

    def run(self):
        loop = asyncio.get_event_loop()
        loop.run_until_complete(self.fetching())

    async def fetching(self):
        while True:
            if self._stopped:  # not update variable
                await asyncio.sleep(1)
                continue
            print("fetching...")
            await asyncio.sleep(1)

    def stop(self):
        self._stopped = True
        print('stop', self._stopped)


if __name__ == "__main__":
    import time

    s = Spider()
    s.start()
    time.sleep(2)
    s.stop()

вывод:

fetching...
fetching...
stop True
fetching...
fetching...

1 Ответ

1 голос
/ 02 апреля 2020

Вы должны использовать общую память между этими двумя процессами (основным и созданным вами). Подумайте об использовании Значение

Исправлен ваш код:

import asyncio
from ctypes import c_bool
from multiprocessing import Process, Value


class Spider(Process):
    def __init__(self):
        super().__init__()
        self._stopped = Value(c_bool, False)  # <== here

    def run(self):
        loop = asyncio.get_event_loop()
        loop.run_until_complete(self.fetching())

    async def fetching(self):
        while True:
            if self._stopped.value:  # <== here
                await asyncio.sleep(1)
                continue
            print("fetching...")
            await asyncio.sleep(1)

    def stop(self):
        self._stopped.value = True  # <== here
        print('stop', self._stopped)


if __name__ == "__main__":
    import time

    s = Spider()
    s.start()
    time.sleep(2)
    s.stop()

Но, честно говоря, если вы получите значение "stop" как True, вы должны break из l oop и не продолжать это вечно.

...