cobweb-launcher 1.2.51__tar.gz → 1.2.53__tar.gz

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.

Potentially problematic release.


This version of cobweb-launcher might be problematic. Click here for more details.

Files changed (45) hide show
  1. {cobweb-launcher-1.2.51/cobweb_launcher.egg-info → cobweb-launcher-1.2.53}/PKG-INFO +1 -1
  2. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb/db/redis_db.py +48 -18
  3. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb/launchers/launcher.py +18 -1
  4. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb/launchers/launcher_pro.py +3 -3
  5. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53/cobweb_launcher.egg-info}/PKG-INFO +1 -1
  6. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/setup.py +1 -1
  7. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/LICENSE +0 -0
  8. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/README.md +0 -0
  9. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb/__init__.py +0 -0
  10. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb/base/__init__.py +0 -0
  11. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb/base/common_queue.py +0 -0
  12. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb/base/decorators.py +0 -0
  13. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb/base/item.py +0 -0
  14. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb/base/log.py +0 -0
  15. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb/base/request.py +0 -0
  16. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb/base/response.py +0 -0
  17. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb/base/seed.py +0 -0
  18. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb/constant.py +0 -0
  19. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb/crawlers/__init__.py +0 -0
  20. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb/crawlers/base_crawler.py +0 -0
  21. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb/crawlers/crawler.py +0 -0
  22. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb/crawlers/file_crawler.py +0 -0
  23. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb/db/__init__.py +0 -0
  24. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb/db/api_db.py +0 -0
  25. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb/exceptions/__init__.py +0 -0
  26. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb/exceptions/oss_db_exception.py +0 -0
  27. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb/launchers/__init__.py +0 -0
  28. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb/launchers/launcher_air.py +0 -0
  29. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb/launchers/launcher_api.py +0 -0
  30. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb/pipelines/__init__.py +0 -0
  31. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb/pipelines/pipeline.py +0 -0
  32. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb/pipelines/pipeline_console.py +0 -0
  33. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb/pipelines/pipeline_loghub.py +0 -0
  34. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb/setting.py +0 -0
  35. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb/utils/__init__.py +0 -0
  36. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb/utils/bloom.py +0 -0
  37. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb/utils/dotting.py +0 -0
  38. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb/utils/oss.py +0 -0
  39. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb/utils/tools.py +0 -0
  40. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb_launcher.egg-info/SOURCES.txt +0 -0
  41. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb_launcher.egg-info/dependency_links.txt +0 -0
  42. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb_launcher.egg-info/requires.txt +0 -0
  43. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/cobweb_launcher.egg-info/top_level.txt +0 -0
  44. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/setup.cfg +0 -0
  45. {cobweb-launcher-1.2.51 → cobweb-launcher-1.2.53}/test/test.py +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cobweb-launcher
3
- Version: 1.2.51
3
+ Version: 1.2.53
4
4
  Summary: spider_hole
5
5
  Home-page: https://github.com/Juannie-PP/cobweb
6
6
  Author: Juannie-PP
@@ -6,60 +6,90 @@ class RedisDB:
6
6
 
7
7
  def __init__(self, **kwargs):
8
8
  redis_config = kwargs or setting.REDIS_CONFIG
9
- pool = redis.ConnectionPool(**redis_config)
10
- self._client = redis.Redis(connection_pool=pool)
9
+ # pool = redis.ConnectionPool(**redis_config)
10
+ self.pool = redis.ConnectionPool(
11
+ max_connections=25,
12
+ **redis_config
13
+ )
14
+
15
+ def get_connection(self):
16
+ return redis.StrictRedis(connection_pool=self.pool)
17
+ # self._client = redis.Redis(connection_pool=pool)
18
+
19
+ def get(self, name):
20
+ with self.get_connection() as client:
21
+ return client.get(name)
22
+
23
+ def incrby(self, name, value):
24
+ with self.get_connection() as client:
25
+ client.incrby(name, value)
11
26
 
12
27
  def setnx(self, name, value=""):
13
- return self._client.setnx(name, value)
28
+ with self.get_connection() as client:
29
+ client.setnx(name, value)
14
30
 
15
31
  def setex(self, name, t, value=""):
16
- return self._client.setex(name, t, value)
32
+ with self.get_connection() as client:
33
+ client.setex(name, t, value)
17
34
 
18
35
  def expire(self, name, t, nx: bool = False, xx: bool = False, gt: bool = False, lt: bool = False):
19
- return self._client.expire(name, t, nx, xx, gt, lt)
36
+ with self.get_connection() as client:
37
+ client.expire(name, t, nx, xx, gt, lt)
20
38
 
21
39
  def ttl(self, name):
22
- return self._client.ttl(name)
40
+ with self.get_connection() as client:
41
+ return client.ttl(name)
23
42
 
24
43
  def delete(self, name):
25
- return self._client.delete(name)
44
+ with self.get_connection() as client:
45
+ return client.delete(name)
26
46
 
27
47
  def exists(self, *name) -> bool:
28
- return self._client.exists(*name)
48
+ with self.get_connection() as client:
49
+ return client.exists(*name)
29
50
 
30
51
  def sadd(self, name, value):
31
- return self._client.sadd(name, value)
52
+ with self.get_connection() as client:
53
+ return client.sadd(name, value)
32
54
 
33
55
  def zcard(self, name) -> bool:
34
- return self._client.zcard(name)
56
+ with self.get_connection() as client:
57
+ return client.zcard(name)
35
58
 
36
59
  def zadd(self, name, item: dict, **kwargs):
37
- return self._client.zadd(name, item, **kwargs)
60
+ with self.get_connection() as client:
61
+ return client.zadd(name, item, **kwargs)
38
62
 
39
63
  def zrem(self, name, *value):
40
- return self._client.zrem(name, *value)
64
+ with self.get_connection() as client:
65
+ return client.zrem(name, *value)
41
66
 
42
67
  def zcount(self, name, _min, _max):
43
- return self._client.zcount(name, _min, _max)
68
+ with self.get_connection() as client:
69
+ return client.zcount(name, _min, _max)
44
70
 
45
71
  # def zrangebyscore(self, name, _min, _max, start, num, withscores: bool = False, *args):
46
- # return self._client.zrangebyscore(name, _min, _max, start, num, withscores, *args)
72
+ # with self.get_connection() as client:
73
+ # return client.zrangebyscore(name, _min, _max, start, num, withscores, *args)
47
74
 
48
75
  def lua(self, script: str, keys: list = None, args: list = None):
49
76
  keys = keys or []
50
77
  args = args or []
51
78
  keys_count = len(keys)
52
- return self._client.eval(script, keys_count, *keys, *args)
79
+ with self.get_connection() as client:
80
+ return client.eval(script, keys_count, *keys, *args)
53
81
 
54
82
  def lua_sha(self, sha1: str, keys: list = None, args: list = None):
55
83
  keys = keys or []
56
84
  args = args or []
57
85
  keys_count = len(keys)
58
- return self._client.evalsha(sha1, keys_count, *keys, *args)
86
+ with self.get_connection() as client:
87
+ return client.evalsha(sha1, keys_count, *keys, *args)
59
88
 
60
89
  def execute_lua(self, lua_script: str, keys: list, *args):
61
- execute = self._client.register_script(lua_script)
62
- return execute(keys=keys, args=args)
90
+ with self.get_connection() as client:
91
+ execute = client.register_script(lua_script)
92
+ return execute(keys=keys, args=args)
63
93
 
64
94
  def lock(self, key, t=15) -> bool:
65
95
  lua_script = """
@@ -51,6 +51,8 @@ class Launcher(threading.Thread):
51
51
  "_delete",
52
52
  ]
53
53
 
54
+ __WORKER_THREAD__ = {}
55
+
54
56
  def __init__(self, task, project, custom_setting=None, **kwargs):
55
57
  super().__init__()
56
58
  self.task = task
@@ -179,9 +181,22 @@ class Launcher(threading.Thread):
179
181
 
180
182
  def _execute(self):
181
183
  for func_name in self.__LAUNCHER_FUNC__:
182
- threading.Thread(name=func_name, target=getattr(self, func_name)).start()
184
+ worker_thread = threading.Thread(name=func_name, target=getattr(self, func_name))
185
+ self.__WORKER_THREAD__[func_name] = worker_thread
186
+ worker_thread.start()
183
187
  time.sleep(1)
184
188
 
189
+ def _monitor(self):
190
+ while True:
191
+ for func_name, worker_thread in self.__WORKER_THREAD__.items():
192
+ if not worker_thread.is_alive():
193
+ logger.info(f"{func_name} thread is dead. Restarting...")
194
+ target = getattr(self, func_name)
195
+ worker_thread = threading.Thread(name=func_name, target=target)
196
+ self.__WORKER_THREAD__[func_name] = worker_thread
197
+ worker_thread.start()
198
+ time.sleep(5)
199
+
185
200
  def run(self):
186
201
  threading.Thread(target=self._execute_heartbeat).start()
187
202
 
@@ -210,6 +225,8 @@ class Launcher(threading.Thread):
210
225
  wait_seconds=self._upload_queue_wait_seconds
211
226
  ).start()
212
227
 
228
+ threading.Thread(target=self._monitor).start()
229
+
213
230
  self._execute()
214
231
  self._polling()
215
232
 
@@ -40,11 +40,11 @@ class LauncherPro(Launcher):
40
40
  if not self._task_model and not self._db.exists(key):
41
41
  self._db.setex(key, 86400 * 30, int(count))
42
42
  else:
43
- self._db._client.incrby(key, count)
43
+ self._db.incrby(key, count)
44
44
 
45
45
  def _get_seed(self) -> Seed:
46
46
  if self._speed_control:
47
- spider_speed = self._db._client.get(self._speed_control_key)
47
+ spider_speed = self._db.get(self._speed_control_key)
48
48
  if int(spider_speed or 0) > self._spider_max_count:
49
49
  expire_time = self._db.ttl(self._speed_control_key)
50
50
  if expire_time == -1:
@@ -55,7 +55,7 @@ class LauncherPro(Launcher):
55
55
  return None
56
56
  seed = self.__LAUNCHER_QUEUE__["todo"].pop()
57
57
  if self._speed_control and seed and not self._db.lock(self._speed_control_key, t=self._time_window):
58
- self._db._client.incrby(self._speed_control_key, 1)
58
+ self._db.incrby(self._speed_control_key, 1)
59
59
  return seed
60
60
 
61
61
  @check_pause
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cobweb-launcher
3
- Version: 1.2.51
3
+ Version: 1.2.53
4
4
  Summary: spider_hole
5
5
  Home-page: https://github.com/Juannie-PP/cobweb
6
6
  Author: Juannie-PP
@@ -5,7 +5,7 @@ with open("README.md", "r", encoding="utf-8") as fh:
5
5
 
6
6
  setup(
7
7
  name="cobweb-launcher",
8
- version="1.2.51",
8
+ version="1.2.53",
9
9
  packages=find_packages(),
10
10
  url="https://github.com/Juannie-PP/cobweb",
11
11
  license="MIT",