Make it possible to pause /resume

fetching chat
This commit is contained in:
taizan-hokuto
2019-11-11 21:04:20 +09:00
parent 194eecec2f
commit ba4e75063a
2 changed files with 22 additions and 3 deletions

View File

@@ -3,7 +3,6 @@ import datetime
import json import json
import random import random
import signal import signal
import threading
import time import time
import traceback import traceback
import urllib.parse import urllib.parse

View File

@@ -3,11 +3,11 @@ import datetime
import json import json
import random import random
import signal import signal
import threading
import time import time
import traceback import traceback
import urllib.parse import urllib.parse
from concurrent.futures import CancelledError, ThreadPoolExecutor from concurrent.futures import CancelledError, ThreadPoolExecutor
from queue import Queue
from .buffer import Buffer from .buffer import Buffer
from .replayparser import Parser from .replayparser import Parser
from .. import config from .. import config
@@ -83,8 +83,10 @@ class ReplayChat:
self._direct_mode = direct_mode self._direct_mode = direct_mode
self._is_alive = True self._is_alive = True
self._parser = Parser() self._parser = Parser()
self._pauser = Queue()
self._pauser.put_nowait(None)
self._setup() self._setup()
if not ReplayChat._setup_finished: if not ReplayChat._setup_finished:
ReplayChat._setup_finished = True ReplayChat._setup_finished = True
if interruptable: if interruptable:
@@ -156,6 +158,12 @@ class ReplayChat:
try: try:
with requests.Session() as session: with requests.Session() as session:
while(continuation and self._is_alive): while(continuation and self._is_alive):
if self._pauser.empty():
#pauseが呼ばれて_pauserが空状態のときは一時停止する
self._pauser.get()
#resumeが呼ばれて_pauserにitemが入ったら再開する
#直後に_pauserにitem(None)を入れてブロックを防ぐ
self._pauser.put_nowait(None)
livechat_json = ( livechat_json = (
self._get_livechat_json(continuation, session, headers) self._get_livechat_json(continuation, session, headers)
) )
@@ -244,6 +252,18 @@ class ReplayChat:
raise IllegalFunctionCall( raise IllegalFunctionCall(
"既にcallbackを登録済みのため、get()は実行できません。") "既にcallbackを登録済みのため、get()は実行できません。")
def pause(self):
'''チャット取得を一時停止する。'''
if not self._pauser.empty():
self._pauser.get()
def resume(self):
'''チャット取得を再開する。'''
if self._pauser.empty():
self._pauser.put_nowait(None)
def is_alive(self): def is_alive(self):
return self._is_alive return self._is_alive