cobweb-launcher 1.0.0__py3-none-any.whl → 1.0.2__py3-none-any.whl

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/__init__.py +1 -1
  2. cobweb/launchers/launcher.py +1 -2
  3. {cobweb_launcher-1.0.0.dist-info → cobweb_launcher-1.0.2.dist-info}/METADATA +1 -1
  4. cobweb_launcher-1.0.2.dist-info/RECORD +32 -0
  5. cobweb/bbb.py +0 -191
  6. cobweb/config.py +0 -164
  7. cobweb/db/oss_db.py +0 -128
  8. cobweb/db/scheduler/__init__.py +0 -1
  9. cobweb/db/scheduler/default.py +0 -8
  10. cobweb/db/scheduler/textfile.py +0 -27
  11. cobweb/db/storer/__init__.py +0 -1
  12. cobweb/db/storer/console.py +0 -9
  13. cobweb/db/storer/loghub.py +0 -54
  14. cobweb/db/storer/redis.py +0 -15
  15. cobweb/db/storer/textfile.py +0 -15
  16. cobweb/decorators.py +0 -16
  17. cobweb/distributed/__init__.py +0 -0
  18. cobweb/distributed/launcher.py +0 -243
  19. cobweb/distributed/models.py +0 -143
  20. cobweb/equip/__init__.py +0 -8
  21. cobweb/equip/dev/__init__.py +0 -0
  22. cobweb/equip/dev/launcher.py +0 -202
  23. cobweb/equip/dev/models.py +0 -156
  24. cobweb/equip/distributed/__init__.py +0 -0
  25. cobweb/equip/distributed/launcher.py +0 -219
  26. cobweb/equip/distributed/models.py +0 -158
  27. cobweb/equip/download/__init__.py +0 -0
  28. cobweb/equip/download/launcher.py +0 -203
  29. cobweb/equip/download/models.py +0 -169
  30. cobweb/equip/single/__init__.py +0 -0
  31. cobweb/equip/single/launcher.py +0 -203
  32. cobweb/equip/single/models.py +0 -173
  33. cobweb/interface.py +0 -34
  34. cobweb/log.py +0 -96
  35. cobweb/new.py +0 -20
  36. cobweb/single/__init__.py +0 -0
  37. cobweb/single/launcher.py +0 -231
  38. cobweb/single/models.py +0 -134
  39. cobweb/single/nest.py +0 -153
  40. cobweb/task.py +0 -61
  41. cobweb/utils.py +0 -90
  42. cobweb_launcher-1.0.0.dist-info/RECORD +0 -69
  43. {cobweb_launcher-1.0.0.dist-info → cobweb_launcher-1.0.2.dist-info}/LICENSE +0 -0
  44. {cobweb_launcher-1.0.0.dist-info → cobweb_launcher-1.0.2.dist-info}/WHEEL +0 -0
  45. {cobweb_launcher-1.0.0.dist-info → cobweb_launcher-1.0.2.dist-info}/top_level.txt +0 -0
@@ -1,173 +0,0 @@
1
- import time
2
- from inspect import isgenerator
3
- # from pympler import asizeof
4
- from .. import log, ici
5
- from .. import DealModel, Queue, Seed, Setting
6
-
7
-
8
- class Scheduler:
9
-
10
- def schedule_seed(self, ready_seed_length, get_scheduler_lock, add_seed):
11
-
12
- inf_name = "SchedulerInterface"
13
- if not ici(self.__class__, inf_name):
14
- raise Exception("not have schedule function!")
15
-
16
- if self.__class__.__name__ == "Default":
17
- self.stop = True
18
- return None
19
-
20
- while not self.stop:
21
- length = ready_seed_length()
22
- if length > self.size:
23
- time.sleep(15)
24
-
25
- elif get_scheduler_lock():
26
- seeds = self.schedule()
27
- add_seed(seeds)
28
-
29
- log.info(f"close thread: schedule_seed")
30
-
31
- def schedule_task(self, stop, get_seed, ready_seed_length):
32
- time.sleep(3)
33
- while not stop.is_set():
34
-
35
- if not ready_seed_length():
36
- time.sleep(Setting.SCHEDULER_WAIT_TIME)
37
- continue
38
-
39
- if self.queue.length >= self.length:
40
- time.sleep(Setting.SCHEDULER_BLOCK_TIME)
41
- continue
42
-
43
- seeds = get_seed(self.length)
44
- self.queue.push(seeds)
45
- log.info(f"close thread: schedule_task")
46
-
47
-
48
- class Spider:
49
-
50
- def __init__(self, queue, storage, max_retries=5):
51
- self.spider_in_progress = Queue()
52
- self.max_retries = max_retries
53
- self.storage = storage
54
- self.queue = queue
55
-
56
- def spider_task(self, stop, func, item, del_seed, add_seed):
57
- while not stop.is_set():
58
-
59
- seed = self.queue.pop()
60
-
61
- if not seed:
62
- time.sleep(Setting.SPIDER_WAIT_TIME)
63
- continue
64
-
65
- elif seed._retry >= self.max_retries:
66
- del_seed(seed, spider_status=False)
67
- continue
68
-
69
- try:
70
- self.spider_in_progress.push(1, direct_insertion=True)
71
- log.info("spider seed: " + str(seed))
72
-
73
- store_queue = None
74
- store_data = list()
75
- add_seed_list = list()
76
- iterators = func(item, seed)
77
-
78
- if not isgenerator(iterators):
79
- if not self.storage:
80
- del_seed(seed, spider_status=True)
81
- continue
82
- raise TypeError(f"{func.__name__} isn't a generator")
83
-
84
- status = None
85
- for it in iterators:
86
- status = True
87
- # if getattr(it, "table_name", None):
88
- # store_queue = it.queue()
89
- # store_queue.push(
90
- # [seed, it.struct_data],
91
- # direct_insertion=True
92
- # )
93
- if getattr(it, "table_name", None):
94
- if not store_queue:
95
- store_queue = it.queue()
96
- store_data.append(it.struct_data)
97
- elif isinstance(it, Seed):
98
- add_seed_list.append(it)
99
-
100
- elif isinstance(it, str) and it == DealModel.polling:
101
- self.queue.push(seed)
102
- break
103
- elif isinstance(it, str) and it == DealModel.success:
104
- del_seed(seed, spider_status=True)
105
- break
106
- elif isinstance(it, str) and it == DealModel.failure:
107
- del_seed(seed, spider_status=False)
108
- break
109
- else:
110
- raise TypeError("yield value type error!")
111
-
112
- if not status:
113
- raise Exception("yield value type error!")
114
- if store_queue and store_data:
115
- store_data.append(seed)
116
- store_queue.push(store_data)
117
- if add_seed_list:
118
- del_seed(seed, spider_status=True)
119
- add_seed(add_seed_list)
120
-
121
- except Exception as e:
122
- seed._retry += 1
123
- self.queue.push(seed)
124
- log.info(f"{str(seed)} -> {str(e)}")
125
- finally:
126
- self.spider_in_progress.pop()
127
- time.sleep(Setting.SPIDER_SLEEP_TIME)
128
- log.info(f"close thread: spider")
129
-
130
-
131
- class Storer:
132
-
133
- def store_task(self, stop, last, reset_seed, del_seed):
134
-
135
- inf_name = "StorerInterface"
136
- if not ici(self.__class__, inf_name):
137
- return None
138
-
139
- if not getattr(self, "store", None):
140
- raise Exception("not have store function!")
141
-
142
- storer_name = self.__class__.__name__ + self.table
143
-
144
- while not stop.is_set():
145
-
146
- storer_length = self.queue.length
147
- if not storer_length:
148
- time.sleep(5)
149
- continue
150
- elif not last.is_set() and storer_length < self.length:
151
- time.sleep(3)
152
- continue
153
-
154
- seeds, data_list = [], []
155
-
156
- while True:
157
- data = self.queue.pop()
158
- if not data:
159
- break
160
- if isinstance(data, Seed):
161
- seeds.append(data)
162
- if len(data_list) >= self.length:
163
- break
164
- continue
165
- data_list.append(data)
166
-
167
- if self.store(data_list):
168
- del_seed(seeds)
169
- else:
170
- reset_seed(seeds)
171
-
172
-
173
- log.info(f"close thread: {storer_name}")
cobweb/interface.py DELETED
@@ -1,34 +0,0 @@
1
- from abc import ABC, abstractmethod
2
- from .utils import parse_info
3
-
4
-
5
- class SchedulerInterface(ABC):
6
-
7
- def __init__(self, table, sql, length, size, queue, config=None):
8
- self.sql = sql
9
- self.table = table
10
- self.length = length
11
- self.size = size
12
- self.queue = queue
13
- self.config = parse_info(config)
14
- self.stop = False
15
-
16
- @abstractmethod
17
- def schedule(self, *args, **kwargs):
18
- pass
19
-
20
-
21
- class StorerInterface(ABC):
22
-
23
- def __init__(self, table, fields, length, queue, config=None):
24
- self.table = table
25
- self.fields = fields
26
- self.length = length
27
- self.queue = queue
28
- self.config = parse_info(config)
29
- # self.redis_db = redis_db
30
-
31
- @abstractmethod
32
- def store(self, *args, **kwargs):
33
- pass
34
-
cobweb/log.py DELETED
@@ -1,96 +0,0 @@
1
- import logging
2
-
3
-
4
- class ColorCodes:
5
- # Text Reset
6
- RESET = "\033[0m"
7
-
8
- # Regular Colors
9
- RED = "\033[31m"
10
- GREEN = "\033[32m"
11
- YELLOW = "\033[33m"
12
- BLUE = "\033[34m"
13
- PURPLE = "\033[35m"
14
- CYAN = "\033[36m"
15
- WHITE = "\033[37m"
16
-
17
- # Bright Colors
18
- BRIGHT_RED = "\033[91m"
19
- BRIGHT_GREEN = "\033[92m"
20
- BRIGHT_YELLOW = "\033[93m"
21
- BRIGHT_BLUE = "\033[94m"
22
- BRIGHT_PURPLE = "\033[95m"
23
- BRIGHT_CYAN = "\033[96m"
24
- BRIGHT_WHITE = "\033[97m"
25
-
26
- # Background Colors
27
- BG_RED = "\033[41m"
28
- BG_GREEN = "\033[42m"
29
- BG_YELLOW = "\033[43m"
30
- BG_BLUE = "\033[44m"
31
- BG_PURPLE = "\033[45m"
32
- BG_CYAN = "\033[46m"
33
- BG_WHITE = "\033[47m"
34
-
35
- # Bright Background Colors
36
- BG_BRIGHT_RED = "\033[101m"
37
- BG_BRIGHT_GREEN = "\033[102m"
38
- BG_BRIGHT_YELLOW = "\033[103m"
39
- BG_BRIGHT_BLUE = "\033[104m"
40
- BG_BRIGHT_PURPLE = "\033[105m"
41
- BG_BRIGHT_CYAN = "\033[106m"
42
- BG_BRIGHT_WHITE = "\033[107m"
43
-
44
- # Text Styles
45
- BOLD = "\033[1m"
46
- DIM = "\033[2m"
47
- ITALIC = "\033[3m"
48
- UNDERLINE = "\033[4m"
49
- BLINK = "\033[5m"
50
- REVERSE = "\033[7m"
51
- HIDDEN = "\033[8m"
52
-
53
-
54
- class Log:
55
- logging.basicConfig(
56
- level=logging.INFO,
57
- format=f'%(asctime)s %(name)s [%(filename)s:%(lineno)d %(funcName)s]'
58
- f' %(levelname)s -> %(message)s'
59
- )
60
- log = logging.getLogger()
61
-
62
- def set_log_name(self, name):
63
- self.__class__.log = logging.getLogger(name)
64
-
65
- @property
66
- def debug(self):
67
- return self.__class__.log.debug
68
-
69
- @property
70
- def info(self):
71
- return self.__class__.log.info
72
-
73
- @property
74
- def warning(self):
75
- return self.__class__.log.warning
76
-
77
- @property
78
- def exception(self):
79
- return self.__class__.log.exception
80
-
81
- @property
82
- def error(self):
83
- return self.__class__.log.error
84
-
85
- @property
86
- def critical(self):
87
- return self.__class__.log.critical
88
-
89
-
90
- log = Log()
91
- # log.info("This text will be bold!")
92
- # print(ColorCodes.BOLD + "This text will be bold!" + ColorCodes.RESET)
93
- # print(ColorCodes.UNDERLINE + ColorCodes.BLUE + "This text will be underlined and blue!" + ColorCodes.RESET)
94
- # print(ColorCodes.BG_YELLOW + ColorCodes.RED + "This text will have a yellow background and red text!" + ColorCodes.RESET)
95
- # print(ColorCodes.BLINK + "This text will blink (if supported by the terminal)!" + ColorCodes.RESET)
96
-
cobweb/new.py DELETED
@@ -1,20 +0,0 @@
1
-
2
-
3
-
4
-
5
- class Launcher:
6
-
7
- def __init__(self):
8
- pass
9
-
10
- def register(self, task_name, func):
11
- pass
12
-
13
- def launch(self, task_name):
14
-
15
- def decorator(func):
16
- # 注册爬虫程序
17
- self.register(task_name, func)
18
- return func
19
-
20
- return decorator
cobweb/single/__init__.py DELETED
File without changes
cobweb/single/launcher.py DELETED
@@ -1,231 +0,0 @@
1
- import time
2
- import threading
3
- from threading import Thread
4
-
5
- from .models import Scheduler, Spider, Storer
6
- from cobweb import log, Queue, DBItem, RedisDB
7
- from cobweb.setting import MODEL, RESET_SCORE, CHECK_LOCK_TIME
8
- from cobweb.utils import (
9
- struct_queue_name as sqn,
10
- restore_table_name as rtn,
11
- parse_import_model as pim,
12
- )
13
-
14
-
15
- def check(stop, last, spider, scheduler, storer, ready_seed_length, spider_queue_length):
16
- log.info("run check thread after 30 seconds...")
17
- time.sleep(30)
18
- spider_info = """
19
- ------------------- check: {0} ------------------
20
- redis_spider_seed_length: {1}
21
- redis_ready_seed_length: {2}
22
- running_spider_thread_num: {3}
23
- memory_seed_queue_length: {4}
24
- storer_queue_length_info: {5}
25
- ----------------------- end -----------------------"""
26
- while True:
27
- status = "running"
28
- running_spider_thread_num = spider.spider_in_progress.length
29
- redis_ready_seed_length = ready_seed_length()
30
- redis_spider_seed_length = spider_queue_length()
31
- memory_seed_queue_length = scheduler.queue.length
32
- storer_upload_queue_length = storer.queue.length
33
- if (
34
- scheduler.stop and
35
- # not redis_ready_seed_length and
36
- not memory_seed_queue_length and
37
- not running_spider_thread_num
38
- ):
39
- if not MODEL:
40
- log.info("spider is done?")
41
- last.set()
42
- time.sleep(3)
43
- storer_queue_empty = True
44
- if storer.queue.length:
45
- storer_queue_empty = False
46
- storer_upload_queue_length = storer.queue.length
47
- if (
48
- storer_queue_empty and
49
- not redis_ready_seed_length and
50
- not redis_spider_seed_length
51
- ):
52
- if MODEL:
53
- log.info("waiting for push seeds...")
54
- status = "waiting"
55
- time.sleep(30)
56
- else:
57
- log.info("spider done!")
58
- break
59
-
60
- last.clear()
61
-
62
- log.info(spider_info.format(
63
- status,
64
- redis_spider_seed_length,
65
- redis_ready_seed_length,
66
- running_spider_thread_num,
67
- memory_seed_queue_length,
68
- storer_upload_queue_length
69
- ))
70
-
71
- time.sleep(3)
72
- stop.set()
73
-
74
-
75
- def launcher(task):
76
- """
77
- 任务启动装饰器
78
- :param task: 任务配置信息
79
- """
80
- def decorator(func):
81
- """
82
- Item:
83
- Textfile()
84
- Loghub()
85
- Console()
86
- e.g.
87
- task.fields = "a,b"
88
- func(item, seed)
89
- a = "a"
90
- b = "b"
91
- data = {"a": "a", "b": "b"}
92
- yield item.Loghub(**data)
93
- yield item.Loghub(a=a, b=b)
94
- """
95
- storer_list = []
96
-
97
- # 程序结束事件
98
- last = threading.Event()
99
- # 停止采集事件
100
- stop = threading.Event()
101
-
102
- # 初始化redis信息
103
- redis_db = RedisDB(
104
- task.project, task.task_name, task.redis_info,
105
- model=MODEL, cs_lct=CHECK_LOCK_TIME, rs_time=RESET_SCORE
106
- )
107
-
108
- # new item
109
- item = type("Item", (object,), {"redis_client": redis_db.client})()
110
-
111
- log.info("初始化cobweb!")
112
-
113
- seed_queue = Queue()
114
-
115
- scheduler_info = task.scheduler_info or dict()
116
-
117
- # 调度器动态继承
118
- sql = scheduler_info.get("sql")
119
- table = scheduler_info.get("table")
120
- size = scheduler_info.get("size")
121
- scheduler_config = scheduler_info.get("config")
122
- scheduler_db = scheduler_info.get("db", "default")
123
- DB, class_name = pim(scheduler_db, "scheduler")
124
- # SchedulerDB, table, sql, length, size, config = task.scheduler_info
125
- SchedulerTmp = type(class_name, (Scheduler, DB), {})
126
-
127
- # 初始化调度器
128
- scheduler = SchedulerTmp(
129
- table=table, sql=sql, size=size, queue=seed_queue,
130
- length=task.scheduler_queue_length, config=scheduler_config
131
- )
132
-
133
- # 初始化采集器
134
- spider = Spider(seed_queue, task.max_retries)
135
-
136
- storer = None
137
-
138
- # 解析存储器信息
139
- storer_info = task.storer_info or dict()
140
-
141
- # for storer_info in storer_info_list:
142
- if storer_info:
143
- storer_db = storer_info["db"]
144
- fields = storer_info["fields"]
145
- storer_table = storer_info.get("table", "console")
146
- storer_config = storer_info.get("config")
147
-
148
- StorerDB, class_name = pim(storer_db, "storer")
149
- StorerTmp = type(class_name, (Storer, StorerDB), {})
150
-
151
- db_name = class_name.lower()
152
- if not getattr(item, db_name, None):
153
- instance = type(db_name, (DBItem,), {})
154
- setattr(item, db_name, instance)
155
-
156
- storer_item_instance = getattr(item, db_name)
157
- storer_item_instance.init_item(storer_table, fields)
158
-
159
- storer_queue = sqn(db_name, storer_table)
160
- queue = getattr(storer_item_instance, storer_queue)
161
- # 初始话存储器
162
- table_name = rtn(table_name=storer_table)
163
- storer = StorerTmp(
164
- table=table_name, fields=fields,
165
- length=task.storer_queue_length,
166
- queue=queue, config=storer_config
167
- )
168
-
169
- Thread(target=redis_db.check_spider_queue, args=(stop, len(storer_list))).start()
170
- Thread(target=redis_db.set_heartbeat, args=(stop,)).start()
171
-
172
- # 推送初始种子
173
- # seeds = start_seeds(task.start_seed)
174
- redis_db.add_seed(task.seeds)
175
- # 启动调度器, 调度至redis队列
176
- Thread(
177
- # name="xxxx_schedule_seeds",
178
- target=scheduler.schedule_seed,
179
- args=(
180
- redis_db.ready_seed_length,
181
- redis_db.get_scheduler_lock,
182
- redis_db.add_seed
183
- )
184
- ).start()
185
-
186
- # 启动调度器, 调度任务队列
187
- Thread(
188
- # name="xxxx_schedule_task",
189
- target=scheduler.schedule_task,
190
- args=(
191
- stop, redis_db.get_seed,
192
- redis_db.ready_seed_length
193
- )
194
- ).start()
195
-
196
- # 启动采集器
197
- for index in range(task.spider_num):
198
- Thread(
199
- # name=f"xxxx_spider_task:{index}",
200
- target=spider.spider_task,
201
- args=(
202
- stop, func, item,
203
- redis_db.del_seed
204
- )
205
- ).start()
206
-
207
- # 启动存储器
208
- if storer:
209
- Thread(
210
- # name=f"xxxx_store_task:{storer.table}",
211
- target=storer.store_task,
212
- args=(
213
- stop, last,
214
- redis_db.reset_seed,
215
- redis_db.del_seed
216
- )
217
- ).start()
218
-
219
- Thread(
220
- # name="check_spider",
221
- target=check,
222
- args=(
223
- stop, last, spider,
224
- scheduler, storer,
225
- redis_db.ready_seed_length,
226
- redis_db.spider_queue_length,
227
- )
228
- ).start()
229
-
230
- return decorator
231
-
cobweb/single/models.py DELETED
@@ -1,134 +0,0 @@
1
- import time
2
- from cobweb import log, Queue, Seed, Setting
3
- from cobweb.utils import issubclass_cobweb_inf
4
- # from pympler import asizeof
5
-
6
-
7
- class Scheduler:
8
-
9
- def schedule_seed(self, ready_seed_length, get_scheduler_lock, add_seed):
10
-
11
- inf_name = "SchedulerInterface"
12
- if not issubclass_cobweb_inf(self.__class__, inf_name):
13
- raise Exception("not have schedule function!")
14
-
15
- if self.__class__.__name__ == "Default":
16
- self.stop = True
17
- return None
18
-
19
- while not self.stop:
20
- length = ready_seed_length()
21
- if length > self.size:
22
- time.sleep(15)
23
-
24
- elif get_scheduler_lock():
25
- seeds = self.schedule()
26
- add_seed(seeds)
27
-
28
- log.info(f"close thread: schedule_seed")
29
-
30
- def schedule_task(self, stop, get_seed, ready_seed_length):
31
- time.sleep(3)
32
- while not stop.is_set():
33
-
34
- if not ready_seed_length():
35
- time.sleep(Setting.SCHEDULER_WAIT_TIME)
36
- continue
37
-
38
- if self.queue.length >= self.length:
39
- time.sleep(Setting.SCHEDULER_BLOCK_TIME)
40
- continue
41
-
42
- seeds = get_seed(self.length)
43
- self.queue.push(seeds)
44
- log.info(f"close thread: schedule_task")
45
-
46
-
47
- class Spider:
48
-
49
- def __init__(self, queue, max_retries=5):
50
- self.spider_in_progress = Queue()
51
- self.max_retries = max_retries
52
- self.queue = queue
53
-
54
- def spider_task(self, stop, func, item, del_seed):
55
- while not stop.is_set():
56
- seed = self.queue.pop()
57
- if not seed:
58
- time.sleep(Setting.SPIDER_WAIT_TIME)
59
- continue
60
- elif seed._retry >= self.max_retries:
61
- del_seed(seed, spider_status=False)
62
- continue
63
- try:
64
- self.spider_in_progress.push(1, direct_insertion=True)
65
- # log.info("spider seed: " + str(seed))
66
- ret_count = 0
67
- status = None
68
- for it in func(item, seed):
69
- ret_count += 1
70
- if getattr(it, "table_name", None):
71
- store_queue = it.queue()
72
- store_queue.push(
73
- [seed, it.struct_data],
74
- direct_insertion=True
75
- )
76
- elif isinstance(it, Seed):
77
- self.queue.push(it)
78
- elif any(isinstance(it, t) for t in (list, tuple)):
79
- self.queue.push([s if isinstance(s, Seed) else Seed(s) for s in it])
80
- elif isinstance(it, bool):
81
- status = it
82
-
83
- if status:
84
- del_seed(seed, spider_status=True)
85
- elif not ret_count or status is False:
86
- seed._retry += 1
87
- self.queue.push(seed)
88
-
89
- except Exception as e:
90
- seed._retry += 1
91
- self.queue.push(seed)
92
- log.info(f"{str(seed)} -> {str(e)}")
93
- finally:
94
- self.spider_in_progress.pop()
95
- log.info(f"close thread: spider")
96
-
97
-
98
- class Storer:
99
-
100
- def store_task(self, stop, last, reset_seed, del_seed):
101
-
102
- inf_name = "StorerInterface"
103
- if not issubclass_cobweb_inf(self.__class__, inf_name):
104
- return None
105
-
106
- if not getattr(self, "store", None):
107
- raise Exception("not have store function!")
108
-
109
- storer_name = self.__class__.__name__ + self.table
110
-
111
- while not stop.is_set():
112
-
113
- if last.is_set() or self.queue.length >= self.length:
114
- seeds, data_list = [], []
115
-
116
- for _ in range(self.length):
117
- items = self.queue.pop()
118
- if not items:
119
- break
120
- seed, data = items
121
- seeds.append(seed)
122
- data_list.append(data)
123
-
124
- if data_list:
125
- if self.store(data_list):
126
- del_seed(seeds)
127
- else:
128
- reset_seed(seeds)
129
- log.info("reset seeds!")
130
- continue
131
-
132
- time.sleep(3)
133
-
134
- log.info(f"close thread: {storer_name}")