cobweb-launcher 3.1.4__tar.gz → 3.1.6__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.
Files changed (47) hide show
  1. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/PKG-INFO +1 -1
  2. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb/__init__.py +2 -0
  3. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb/db/api_db.py +1 -1
  4. cobweb-launcher-3.1.6/cobweb/launchers/__init__.py +4 -0
  5. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb/launchers/distributor.py +3 -9
  6. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb/launchers/uploader.py +3 -3
  7. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb/schedulers/scheduler_with_redis.py +3 -3
  8. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb/setting.py +5 -5
  9. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb_launcher.egg-info/PKG-INFO +1 -1
  10. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb_launcher.egg-info/SOURCES.txt +0 -2
  11. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/setup.py +1 -1
  12. cobweb-launcher-3.1.4/cobweb/launchers/__init__.py +0 -9
  13. cobweb-launcher-3.1.4/cobweb/schedulers/launcher_air.py +0 -93
  14. cobweb-launcher-3.1.4/cobweb/schedulers/launcher_api.py +0 -225
  15. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/LICENSE +0 -0
  16. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/README.md +0 -0
  17. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb/base/__init__.py +0 -0
  18. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb/base/common_queue.py +0 -0
  19. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb/base/item.py +0 -0
  20. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb/base/log.py +0 -0
  21. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb/base/request.py +0 -0
  22. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb/base/response.py +0 -0
  23. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb/base/seed.py +0 -0
  24. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb/constant.py +0 -0
  25. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb/crawlers/__init__.py +0 -0
  26. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb/crawlers/crawler.py +0 -0
  27. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb/db/__init__.py +0 -0
  28. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb/db/redis_db.py +0 -0
  29. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb/exceptions/__init__.py +0 -0
  30. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb/exceptions/oss_db_exception.py +0 -0
  31. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb/launchers/launcher.py +0 -0
  32. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb/pipelines/__init__.py +0 -0
  33. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb/pipelines/pipeline.py +0 -0
  34. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb/pipelines/pipeline_console.py +0 -0
  35. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb/pipelines/pipeline_loghub.py +0 -0
  36. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb/schedulers/__init__.py +0 -0
  37. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb/schedulers/scheduler.py +0 -0
  38. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb/utils/__init__.py +0 -0
  39. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb/utils/bloom.py +0 -0
  40. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb/utils/decorators.py +0 -0
  41. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb/utils/dotting.py +0 -0
  42. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb/utils/oss.py +0 -0
  43. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb/utils/tools.py +0 -0
  44. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb_launcher.egg-info/dependency_links.txt +0 -0
  45. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb_launcher.egg-info/requires.txt +0 -0
  46. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/cobweb_launcher.egg-info/top_level.txt +0 -0
  47. {cobweb-launcher-3.1.4 → cobweb-launcher-3.1.6}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cobweb-launcher
3
- Version: 3.1.4
3
+ Version: 3.1.6
4
4
  Summary: spider_hole
5
5
  Home-page: https://github.com/Juannie-PP/cobweb
6
6
  Author: Juannie-PP
@@ -1,2 +1,4 @@
1
1
  from .launchers import Launcher
2
2
  from .constant import CrawlerModel
3
+ from .pipelines import Pipeline
4
+ from .crawlers import Crawler
@@ -71,7 +71,7 @@ class ApiDB:
71
71
  def auto_incr(self, name, t=15, limit=1000) -> bool:
72
72
  return self._get_response(api="/auto_incr", params=dict(name=name, t=t, limit=limit))
73
73
 
74
- def members(self, name, score, start=0, count=5000, _min="-inf", _max="+inf"):
74
+ def members(self, name, score, start=0, count=1000, _min="-inf", _max="+inf"):
75
75
  return self._get_response(api="/members", params=dict(name=name, score=score, start=start, count=count, min=_min, max=_max))
76
76
 
77
77
  def done(self, name: list, *values):
@@ -0,0 +1,4 @@
1
+ from .launcher import Launcher
2
+ from .uploader import Uploader
3
+ from .distributor import Distributor
4
+
@@ -1,22 +1,16 @@
1
1
  import time
2
2
  import threading
3
3
  import traceback
4
- from inspect import isgenerator
4
+
5
5
  from typing import Callable
6
+ from inspect import isgenerator
6
7
  from urllib.parse import urlparse
7
8
  from requests import Response as Res
8
9
 
9
10
  from cobweb import setting
10
11
  from cobweb.constant import DealModel, LogTemplate
11
- from cobweb.base import (
12
- Seed,
13
- Queue,
14
- BaseItem,
15
- Request,
16
- Response,
17
- logger
18
- )
19
12
  from cobweb.utils import LoghubDot, check_pause
13
+ from cobweb.base import Seed, Queue, BaseItem, Request, Response, logger
20
14
 
21
15
 
22
16
  class Distributor(threading.Thread):
@@ -27,7 +27,7 @@ class Uploader(threading.Thread):
27
27
  self.upload_size = setting.UPLOAD_QUEUE_MAX_SIZE
28
28
  self.wait_seconds = setting.UPLOAD_QUEUE_WAIT_SECONDS
29
29
 
30
- self.Pipeline = SpiderPipeline
30
+ self.pipeline = SpiderPipeline()
31
31
 
32
32
  logger.debug(f"Uploader instance attrs: {self.__dict__}")
33
33
 
@@ -45,11 +45,11 @@ class Uploader(threading.Thread):
45
45
  if not item:
46
46
  break
47
47
  seeds.append(item.seed)
48
- data = self.Pipeline.build(item)
48
+ data = self.pipeline.build(item)
49
49
  data_info.setdefault(item.table, []).append(data)
50
50
  for table, datas in data_info.items():
51
51
  try:
52
- self.Pipeline.upload(table, datas)
52
+ self.pipeline.upload(table, datas)
53
53
  except Exception as e:
54
54
  logger.info(e)
55
55
  except Exception as e:
@@ -7,7 +7,7 @@ from cobweb.utils import check_pause
7
7
  from cobweb.base import Queue, Seed, logger
8
8
  from cobweb.constant import LogTemplate
9
9
  from .scheduler import Scheduler
10
- use_api = bool(int(os.getenv("REDIS_API", 0)))
10
+ use_api = bool(int(os.getenv("REDIS_API_HOST", 0)))
11
11
 
12
12
 
13
13
  class RedisScheduler(Scheduler):
@@ -153,10 +153,10 @@ class RedisScheduler(Scheduler):
153
153
  else:
154
154
  if all_count:
155
155
  logger.info(f"todo seeds count: {todo_count}, queue length: {all_count}")
156
- self.pause.is_set()
156
+ self.pause.clear()
157
157
  else:
158
158
  logger.info("Done! pause set...")
159
- self.pause.clear()
159
+ self.pause.set()
160
160
  else:
161
161
  if self.pause.is_set():
162
162
  self.pause.clear()
@@ -18,7 +18,7 @@ LOGHUB_CONFIG = {
18
18
  "accessKey": os.getenv("LOGHUB_SECRET_KEY")
19
19
  }
20
20
 
21
- # oss util config
21
+ # # oss util config
22
22
  OSS_BUCKET = os.getenv("OSS_BUCKET")
23
23
  OSS_ENDPOINT = os.getenv("OSS_ENDPOINT")
24
24
  OSS_ACCESS_KEY = os.getenv("OSS_ACCESS_KEY")
@@ -72,9 +72,9 @@ TASK_MODEL = 0 # 0:单次,1:常驻
72
72
  # 流控措施
73
73
  SPEED_CONTROL = 1 # 0:关闭,1:开启
74
74
 
75
- # bloom过滤器
76
- CAPACITY = 100000000
77
- ERROR_RATE = 0.001
78
- FILTER_FIELD = "url"
75
+ # # bloom过滤器
76
+ # CAPACITY = 100000000
77
+ # ERROR_RATE = 0.001
78
+ # FILTER_FIELD = "url"
79
79
  # 文件下载响应类型过滤
80
80
  # FILE_FILTER_CONTENT_TYPE = ["text/html", "application/xhtml+xml"]
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cobweb-launcher
3
- Version: 3.1.4
3
+ Version: 3.1.6
4
4
  Summary: spider_hole
5
5
  Home-page: https://github.com/Juannie-PP/cobweb
6
6
  Author: Juannie-PP
@@ -27,8 +27,6 @@ cobweb/pipelines/pipeline.py
27
27
  cobweb/pipelines/pipeline_console.py
28
28
  cobweb/pipelines/pipeline_loghub.py
29
29
  cobweb/schedulers/__init__.py
30
- cobweb/schedulers/launcher_air.py
31
- cobweb/schedulers/launcher_api.py
32
30
  cobweb/schedulers/scheduler.py
33
31
  cobweb/schedulers/scheduler_with_redis.py
34
32
  cobweb/utils/__init__.py
@@ -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="3.1.4",
8
+ version="3.1.6",
9
9
  packages=find_packages(),
10
10
  url="https://github.com/Juannie-PP/cobweb",
11
11
  license="MIT",
@@ -1,9 +0,0 @@
1
- # from .launcher_air import LauncherAir
2
- # from .launcher_pro import LauncherPro
3
- # from .launcher_api import LauncherApi
4
-
5
-
6
- from .launcher import Launcher
7
- from .uploader import Uploader
8
- from .distributor import Distributor
9
-
@@ -1,93 +0,0 @@
1
- import time
2
-
3
- from cobweb.base import logger
4
- from cobweb.constant import LogTemplate
5
- from .launcher import Launcher, check_pause
6
-
7
-
8
- class LauncherAir(Launcher):
9
-
10
- # def _scheduler(self):
11
- # if self.start_seeds:
12
- # self.__LAUNCHER_QUEUE__['todo'].push(self.start_seeds)
13
-
14
- @check_pause
15
- def _insert(self):
16
- new_seeds = {}
17
- del_seeds = set()
18
- status = self.__LAUNCHER_QUEUE__['new'].length < self._new_queue_max_size
19
- for _ in range(self._new_queue_max_size):
20
- seed_tuple = self.__LAUNCHER_QUEUE__['new'].pop()
21
- if not seed_tuple:
22
- break
23
- seed, new_seed = seed_tuple
24
- new_seeds[new_seed.to_string] = new_seed.params.priority
25
- del_seeds.add(seed.to_string)
26
- if new_seeds:
27
- self.__LAUNCHER_QUEUE__['todo'].push(new_seeds)
28
- if del_seeds:
29
- self.__LAUNCHER_QUEUE__['done'].push(del_seeds)
30
- if status:
31
- time.sleep(self._new_queue_wait_seconds)
32
-
33
- @check_pause
34
- def _delete(self):
35
- seeds = []
36
- status = self.__LAUNCHER_QUEUE__['done'].length < self._done_queue_max_size
37
-
38
- for _ in range(self._done_queue_max_size):
39
- seed = self.__LAUNCHER_QUEUE__['done'].pop()
40
- if not seed:
41
- break
42
- seeds.append(seed.to_string)
43
-
44
- if seeds:
45
- self._remove_doing_seeds(seeds)
46
-
47
- if status:
48
- time.sleep(self._done_queue_wait_seconds)
49
-
50
- def _polling(self):
51
-
52
- check_emtpy_times = 0
53
-
54
- while not self._stop.is_set():
55
-
56
- queue_not_empty_count = 0
57
- pooling_wait_seconds = 30
58
-
59
- for q in self.__LAUNCHER_QUEUE__.values():
60
- if q.length != 0:
61
- queue_not_empty_count += 1
62
-
63
- if queue_not_empty_count == 0:
64
- pooling_wait_seconds = 3
65
- if self._pause.is_set():
66
- check_emtpy_times = 0
67
- if not self._task_model:
68
- logger.info("Done! Ready to close thread...")
69
- self._stop.set()
70
- elif check_emtpy_times > 2:
71
- self.__DOING__ = {}
72
- self._pause.set()
73
- else:
74
- logger.info(
75
- "check whether the task is complete, "
76
- f"reset times {3 - check_emtpy_times}"
77
- )
78
- check_emtpy_times += 1
79
- elif self._pause.is_set():
80
- self._pause.clear()
81
- self._execute()
82
- else:
83
- logger.info(LogTemplate.launcher_air_polling.format(
84
- task=self.task,
85
- doing_len=len(self.__DOING__.keys()),
86
- todo_len=self.__LAUNCHER_QUEUE__['todo'].length,
87
- done_len=self.__LAUNCHER_QUEUE__['done'].length,
88
- upload_len=self.__LAUNCHER_QUEUE__['upload'].length,
89
- ))
90
-
91
- time.sleep(pooling_wait_seconds)
92
-
93
-
@@ -1,225 +0,0 @@
1
- import time
2
- import threading
3
-
4
- from cobweb.db import ApiDB
5
- from cobweb.base import Seed, logger
6
- from cobweb.constant import DealModel, LogTemplate
7
- from .launcher import Launcher, check_pause
8
-
9
-
10
- class LauncherApi(Launcher):
11
-
12
- def __init__(self, task, project, custom_setting=None, **kwargs):
13
- super().__init__(task, project, custom_setting, **kwargs)
14
- self._db = ApiDB()
15
-
16
- self._todo_key = "{%s:%s}:todo" % (project, task)
17
- self._done_key = "{%s:%s}:done" % (project, task)
18
- self._fail_key = "{%s:%s}:fail" % (project, task)
19
- self._heartbeat_key = "heartbeat:%s_%s" % (project, task)
20
-
21
- self._statistics_done_key = "statistics:%s:%s:done" % (project, task)
22
- self._statistics_fail_key = "statistics:%s:%s:fail" % (project, task)
23
- self._speed_control_key = "speed_control:%s_%s" % (project, task)
24
-
25
- self._reset_lock_key = "lock:reset:%s_%s" % (project, task)
26
-
27
- # self._bf_key = "bloom_%s_%s" % (project, task)
28
- # self._bf = BloomFilter(self._bf_key)
29
-
30
- self._heartbeat_start_event = threading.Event()
31
- self._redis_queue_empty_event = threading.Event()
32
-
33
- @property
34
- def heartbeat(self):
35
- return self._db.exists(self._heartbeat_key)
36
-
37
- def statistics(self, key, count):
38
- if not self._task_model and not self._db.exists(key):
39
- self._db.setex(key, 86400 * 30, int(count))
40
- else:
41
- self._db.incrby(key, count)
42
-
43
- def _get_seed(self) -> Seed:
44
- """
45
- 从队列中获取种子(频控)
46
- 设置时间窗口为self._time_window(秒),判断在该窗口内的采集量是否满足阈值(self._spider_max_speed)
47
- :return: True -> 种子, False -> None
48
- """
49
- if (self._speed_control and self.__LAUNCHER_QUEUE__["todo"].length and
50
- not self._db.auto_incr(self._speed_control_key, t=self._time_window, limit=self._spider_max_count)):
51
- expire_time = self._db.ttl(self._speed_control_key)
52
- if isinstance(expire_time, int) and expire_time <= -1:
53
- self._db.delete(self._speed_control_key)
54
- elif isinstance(expire_time, int):
55
- logger.info(f"Too fast! Please wait {expire_time} seconds...")
56
- time.sleep(expire_time / 2)
57
- return None
58
- seed = self.__LAUNCHER_QUEUE__["todo"].pop()
59
- return seed
60
-
61
- @check_pause
62
- def _execute_heartbeat(self):
63
- if self._heartbeat_start_event.is_set():
64
- self._db.setex(self._heartbeat_key, 5)
65
- time.sleep(3)
66
-
67
- @check_pause
68
- def _reset(self):
69
- """
70
- 检查过期种子,重新添加到redis缓存中
71
- """
72
- reset_wait_seconds = 30
73
- if self._db.lock(self._reset_lock_key, t=120):
74
-
75
- _min = -int(time.time()) + self._seed_reset_seconds \
76
- if self.heartbeat else "-inf"
77
-
78
- self._db.members(self._todo_key, 0, _min=_min, _max="(0")
79
-
80
- if not self.heartbeat:
81
- self._heartbeat_start_event.set()
82
-
83
- self._db.delete(self._reset_lock_key)
84
-
85
- time.sleep(reset_wait_seconds)
86
-
87
- @check_pause
88
- def _scheduler(self):
89
- """
90
- 调度任务,获取redis队列种子,同时添加到doing字典中
91
- """
92
- if not self._db.zcount(self._todo_key, 0, "(1000"):
93
- time.sleep(self._scheduler_wait_seconds)
94
- elif self.__LAUNCHER_QUEUE__['todo'].length >= self._todo_queue_size:
95
- time.sleep(self._todo_queue_full_wait_seconds)
96
- else:
97
- members = self._db.members(
98
- self._todo_key, int(time.time()),
99
- count=self._todo_queue_size,
100
- _min=0, _max="(1000"
101
- )
102
- for member, priority in members:
103
- seed = Seed(member, priority=priority)
104
- self.__LAUNCHER_QUEUE__['todo'].push(seed)
105
- self.__DOING__[seed.to_string] = seed.params.priority
106
-
107
- @check_pause
108
- def _insert(self):
109
- """
110
- 添加新种子到redis队列中
111
- """
112
- new_seeds = {}
113
- del_seeds = set()
114
- status = self.__LAUNCHER_QUEUE__['new'].length < self._new_queue_max_size
115
- for _ in range(self._new_queue_max_size):
116
- seed_tuple = self.__LAUNCHER_QUEUE__['new'].pop()
117
- if not seed_tuple:
118
- break
119
- seed, new_seed = seed_tuple
120
- new_seeds[new_seed.to_string] = new_seed.params.priority
121
- del_seeds.add(seed)
122
- if new_seeds:
123
- self._db.zadd(self._todo_key, new_seeds, nx=True)
124
- if del_seeds:
125
- self.__LAUNCHER_QUEUE__['done'].push(list(del_seeds))
126
- if status:
127
- time.sleep(self._new_queue_wait_seconds)
128
-
129
- @check_pause
130
- def _refresh(self):
131
- """
132
- 刷新doing种子过期时间,防止reset重新消费
133
- """
134
- if self.__DOING__:
135
- refresh_time = int(time.time())
136
- seeds = {k:-refresh_time - v / 1000 for k, v in self.__DOING__.items()}
137
- self._db.zadd(self._todo_key, item=seeds, xx=True)
138
- time.sleep(15)
139
-
140
- @check_pause
141
- def _delete(self):
142
- """
143
- 删除队列种子,根据状态添加至成功或失败队列,移除doing字典种子索引
144
- """
145
- # seed_info = {"count": 0, "failed": [], "succeed": [], "common": []}
146
-
147
- seed_list = []
148
- status = self.__LAUNCHER_QUEUE__['done'].length < self._done_queue_max_size
149
-
150
- for _ in range(self._done_queue_max_size):
151
- seed = self.__LAUNCHER_QUEUE__['done'].pop()
152
- if not seed:
153
- break
154
- seed_list.append(seed.to_string)
155
-
156
- if seed_list:
157
-
158
- self._db.zrem(self._todo_key, *seed_list)
159
- self._remove_doing_seeds(seed_list)
160
-
161
- if status:
162
- time.sleep(self._done_queue_wait_seconds)
163
-
164
- def _polling(self):
165
- wait_scheduler_execute = True
166
- check_emtpy_times = 0
167
- while not self._stop.is_set():
168
- queue_not_empty_count = 0
169
- pooling_wait_seconds = 30
170
-
171
- for q in self.__LAUNCHER_QUEUE__.values():
172
- if q.length != 0:
173
- queue_not_empty_count += 1
174
- wait_scheduler_execute = False
175
-
176
- if queue_not_empty_count == 0:
177
- pooling_wait_seconds = 3
178
- if self._pause.is_set():
179
- check_emtpy_times = 0
180
- if not self._task_model and (
181
- not wait_scheduler_execute or
182
- int(time.time()) - self._app_time > self._before_scheduler_wait_seconds
183
- ):
184
- logger.info("Done! ready to close thread...")
185
- self._stop.set()
186
-
187
- elif self._db.zcount(self._todo_key, _min=0, _max="(1000"):
188
- logger.info(f"Recovery {self.task} task run!")
189
- self._pause.clear()
190
- self._execute()
191
- else:
192
- logger.info("pause! waiting for resume...")
193
- elif check_emtpy_times > 2:
194
- self.__DOING__ = {}
195
- seed_count = self._db.zcard(self._todo_key)
196
- logger.info(f"队列剩余种子数:{seed_count}")
197
- if not seed_count:
198
- logger.info("Done! pause set...")
199
- self._pause.set()
200
- else:
201
- self._pause.clear()
202
- else:
203
- logger.info(
204
- "check whether the task is complete, "
205
- f"reset times {3 - check_emtpy_times}"
206
- )
207
- check_emtpy_times += 1
208
- else:
209
- if self._pause.is_set():
210
- self._pause.clear()
211
- logger.info(LogTemplate.launcher_pro_polling.format(
212
- task=self.task,
213
- doing_len=len(self.__DOING__.keys()),
214
- todo_len=self.__LAUNCHER_QUEUE__['todo'].length,
215
- done_len=self.__LAUNCHER_QUEUE__['done'].length,
216
- redis_seed_count=self._db.zcount(self._todo_key, "-inf", "+inf"),
217
- redis_todo_len=self._db.zcount(self._todo_key, 0, "(1000"),
218
- redis_doing_len=self._db.zcount(self._todo_key, "-inf", "(0"),
219
- upload_len=self.__LAUNCHER_QUEUE__['upload'].length,
220
- ))
221
-
222
- time.sleep(pooling_wait_seconds)
223
-
224
- logger.info("Done! Ready to close thread...")
225
-
File without changes