Skip to content

Commit 64fcfd2

Browse files
authored
Merge pull request #119 from MerleLiuKun/up-streaming
feat(streaming): ✨ update retry time for connect server
2 parents 4be6f97 + 030e3da commit 64fcfd2

File tree

2 files changed

+34
-22
lines changed

2 files changed

+34
-22
lines changed

.github/workflows/test.yaml

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ jobs:
2525
- name: Install Poetry
2626
uses: snok/[email protected]
2727
with:
28+
version: 1.1.15
2829
virtualenvs-create: true
2930
virtualenvs-in-project: true
3031
- name: Load cached venv

pytwitter/streaming.py

Lines changed: 33 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
import json
66
import logging
77
import time
8-
from typing import Dict, List, Optional, Set, Tuple, Union
8+
from typing import Dict, List, Optional, Tuple, Union
99

1010
import requests
1111
import pytwitter.models as md
@@ -22,24 +22,34 @@ class StreamApi:
2222

2323
def __init__(
2424
self,
25-
bearer_token=None,
26-
consumer_key=None,
27-
consumer_secret=None,
28-
proxies=None,
29-
max_retries=3,
30-
timeout=None,
31-
chunk_size=1024,
32-
):
33-
self.running = False
34-
self._auth = None
25+
bearer_token: Optional[str] = None,
26+
consumer_key: Optional[str] = None,
27+
consumer_secret: Optional[str] = None,
28+
proxies: Optional[dict] = None,
29+
max_retries: int = 3,
30+
timeout: Optional[int] = None,
31+
chunk_size: int = 1024,
32+
) -> None:
33+
"""
34+
:param bearer_token: Access token for app or user.
35+
:param consumer_key: App consumer key.
36+
:param consumer_secret: App consumer secret.
37+
:param proxies: Proxies for request.
38+
:param max_retries: Request max retry times.
39+
:param timeout: Timeout for request.
40+
:param chunk_size: Chunk size for read data.
41+
"""
3542
self.consumer_key = consumer_key
3643
self.consumer_secret = consumer_secret
3744
self.proxies = proxies
38-
self.session = requests.Session()
3945
self.max_retries = max_retries
4046
self.timeout = timeout
4147
self.chunk_size = chunk_size
4248

49+
self.session = requests.Session()
50+
self._auth = None
51+
self.running = False
52+
4353
if bearer_token:
4454
self._auth = OAuth2Auth(
4555
token={"access_token": bearer_token, "token_type": "Bearer"}
@@ -86,12 +96,10 @@ def _connect(self, url, params=None, return_json=False):
8696
"""
8797
# make sure only one running connect
8898
self.running = True
89-
retries = 0
90-
http_error_wait = 5
91-
http_error_wait_max = 320
99+
retries, retry_interval, retry_wait = 1, 2, 2
92100

93101
try:
94-
while self.running and retries < self.max_retries:
102+
while self.running and retries <= self.max_retries:
95103
with self.session.get(
96104
url=url,
97105
params=params,
@@ -114,17 +122,20 @@ def _connect(self, url, params=None, return_json=False):
114122
self.on_closed(resp)
115123
else:
116124
self.on_request_error(resp)
117-
retries += 1
118-
time.sleep(http_error_wait)
125+
logger.debug(
126+
f"Request connection failed. "
127+
f"Trying again in {retry_wait} seconds... ({retries}/{self.max_retries})"
128+
)
129+
time.sleep(retry_wait)
119130

120-
http_error_wait *= 2
121-
if http_error_wait > http_error_wait_max:
122-
break
131+
retries += 1
132+
retry_wait = retry_interval * retries
123133
except Exception as exc:
124134
logger.exception(f"Exception in request, exc: {exc}")
125135
finally:
136+
logger.debug("Request connection exited")
126137
self.session.close()
127-
self.running = False
138+
self.disconnect()
128139

129140
def disconnect(self):
130141
self.running = False

0 commit comments

Comments
 (0)