cobweb-launcher 1.2.57__py3-none-any.whl → 1.2.58__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.

cobweb/db/redis_db.py CHANGED
@@ -1,68 +1,133 @@
1
1
  import redis
2
+ import time
2
3
  from cobweb import setting
4
+ from redis.exceptions import ConnectionError, TimeoutError
3
5
 
4
6
 
5
- class RedisDB:
6
-
7
+ class RedisClient:
7
8
  def __init__(self, **kwargs):
8
9
  redis_config = kwargs or setting.REDIS_CONFIG
9
- self.pool = redis.ConnectionPool(**redis_config)
10
-
11
- def get_connection(self):
12
- return redis.StrictRedis(connection_pool=self.pool)
13
- # self._client = redis.Redis(connection_pool=pool)
10
+ self.host = redis_config['host']
11
+ self.password = redis_config['password']
12
+ self.port = redis_config['port']
13
+ self.db = redis_config['db']
14
+
15
+ self.max_retries = 5
16
+ self.retry_delay = 5
17
+ self.client = None
18
+ self.connect()
19
+
20
+ def connect(self):
21
+ """尝试连接 Redis"""
22
+ retries = 0
23
+ while retries < self.max_retries:
24
+ try:
25
+ self.client = redis.Redis(
26
+ host=self.host,
27
+ port=self.port,
28
+ password=self.password,
29
+ db=self.db,
30
+ socket_timeout=5, # 设置连接超时时间
31
+ socket_connect_timeout=5 # 设置连接超时时间
32
+ )
33
+ # 测试连接是否成功
34
+ self.client.ping()
35
+ return
36
+ except (ConnectionError, TimeoutError) as e:
37
+ retries += 1
38
+ if retries < self.max_retries:
39
+ time.sleep(self.retry_delay)
40
+ else:
41
+ raise Exception("达到最大重试次数,无法连接 Redis")
42
+
43
+ def is_connected(self):
44
+ try:
45
+ self.client.ping()
46
+ return True
47
+ except (ConnectionError, TimeoutError):
48
+ return False
49
+
50
+ def reconnect(self):
51
+ self.connect()
52
+
53
+ def execute_command(self, command, *args, **kwargs):
54
+ retries = 0
55
+ while retries < self.max_retries:
56
+ try:
57
+ if not self.is_connected():
58
+ self.reconnect()
59
+ return getattr(self.client, command)(*args, **kwargs)
60
+ except (ConnectionError, TimeoutError) as e:
61
+ retries += 1
62
+ if retries < self.max_retries:
63
+ time.sleep(self.retry_delay)
64
+ else:
65
+ raise Exception("达到最大重试次数,无法执行命令")
14
66
 
15
67
  def get(self, name):
16
- with self.get_connection() as client:
17
- return client.get(name)
68
+ # with self.get_connection() as client:
69
+ # return client.get(name)
70
+ return self.execute_command("get", name)
18
71
 
19
72
  def incrby(self, name, value):
20
- with self.get_connection() as client:
21
- client.incrby(name, value)
73
+ # with self.get_connection() as client:
74
+ # client.incrby(name, value)
75
+ self.execute_command("incrby", name, value)
22
76
 
23
77
  def setnx(self, name, value=""):
24
- with self.get_connection() as client:
25
- client.setnx(name, value)
78
+ # with self.get_connection() as client:
79
+ # client.setnx(name, value)
80
+ self.execute_command("setnx", name, value)
26
81
 
27
82
  def setex(self, name, t, value=""):
28
- with self.get_connection() as client:
29
- client.setex(name, t, value)
83
+ # with self.get_connection() as client:
84
+ # client.setex(name, t, value)
85
+ self.execute_command("setex", name, t, value)
30
86
 
31
87
  def expire(self, name, t, nx: bool = False, xx: bool = False, gt: bool = False, lt: bool = False):
32
- with self.get_connection() as client:
33
- client.expire(name, t, nx, xx, gt, lt)
88
+ # with self.get_connection() as client:
89
+ # client.expire(name, t, nx, xx, gt, lt)
90
+ self.execute_command("expire", name, t, nx, xx, gt, lt)
34
91
 
35
92
  def ttl(self, name):
36
- with self.get_connection() as client:
37
- return client.ttl(name)
93
+ # with self.get_connection() as client:
94
+ # return client.ttl(name)
95
+ return self.execute_command("ttl", name)
38
96
 
39
97
  def delete(self, name):
40
- with self.get_connection() as client:
41
- return client.delete(name)
98
+ # with self.get_connection() as client:
99
+ # return client.delete(name)
100
+ return self.execute_command("delete", name)
42
101
 
43
102
  def exists(self, *name) -> bool:
44
- with self.get_connection() as client:
45
- return client.exists(*name)
103
+ # with self.get_connection() as client:
104
+ # return client.exists(*name)
105
+ return self.execute_command("exists", *name)
46
106
 
47
107
  def sadd(self, name, value):
48
- with self.get_connection() as client:
49
- return client.sadd(name, value)
108
+ # with self.get_connection() as client:
109
+ # return client.sadd(name, value)
110
+ return self.execute_command("sadd", name, value)
50
111
 
51
112
  def zcard(self, name) -> bool:
52
- with self.get_connection() as client:
53
- return client.zcard(name)
113
+ # with self.get_connection() as client:
114
+ # return client.zcard(name)
115
+ return self.execute_command("zcard", name)
54
116
 
55
117
  def zadd(self, name, item: dict, **kwargs):
56
- with self.get_connection() as client:
57
- return client.zadd(name, item, **kwargs)
118
+ # with self.get_connection() as client:
119
+ # return client.zadd(name, item, **kwargs)
120
+ return self.execute_command("zadd", name, item, **kwargs)
58
121
 
59
122
  def zrem(self, name, *value):
60
- with self.get_connection() as client:
61
- return client.zrem(name, *value)
123
+ # with self.get_connection() as client:
124
+ # return client.zrem(name, *value)
125
+ return self.execute_command("zrem", name, *value)
62
126
 
63
127
  def zcount(self, name, _min, _max):
64
- with self.get_connection() as client:
65
- return client.zcount(name, _min, _max)
128
+ # with self.get_connection() as client:
129
+ # return client.zcount(name, _min, _max)
130
+ return self.execute_command("zcount", name, _min, _max)
66
131
 
67
132
  # def zrangebyscore(self, name, _min, _max, start, num, withscores: bool = False, *args):
68
133
  # with self.get_connection() as client:
@@ -72,89 +137,14 @@ class RedisDB:
72
137
  keys = keys or []
73
138
  args = args or []
74
139
  keys_count = len(keys)
75
- with self.get_connection() as client:
76
- return client.eval(script, keys_count, *keys, *args)
140
+ return self.execute_command("eval", script, keys_count, *keys, *args)
77
141
 
78
142
  def lua_sha(self, sha1: str, keys: list = None, args: list = None):
79
143
  keys = keys or []
80
144
  args = args or []
81
145
  keys_count = len(keys)
82
- with self.get_connection() as client:
83
- return client.evalsha(sha1, keys_count, *keys, *args)
146
+ return self.execute_command("evalsha", sha1, keys_count, *keys, *args)
84
147
 
85
148
  def execute_lua(self, lua_script: str, keys: list, *args):
86
- with self.get_connection() as client:
87
- execute = client.register_script(lua_script)
88
- return execute(keys=keys, args=args)
89
-
90
- def lock(self, key, t=15) -> bool:
91
- lua_script = """
92
- local status = redis.call('setnx', KEYS[1], 1)
93
- if ( status == 1 ) then
94
- redis.call('expire', KEYS[1], ARGV[1])
95
- end
96
- return status
97
- """
98
- status = self.execute_lua(lua_script, [key], t)
99
- return bool(status)
100
-
101
- def members(self, key, score, start=0, count=5000, _min="-inf", _max="+inf") -> list:
102
- lua_script = """
103
- local min = ARGV[1]
104
- local max = ARGV[2]
105
- local start = ARGV[3]
106
- local count = ARGV[4]
107
- local score = ARGV[5]
108
- local members = nil
109
-
110
- if ( type(count) == string ) then
111
- members = redis.call('zrangebyscore', KEYS[1], min, max, 'WITHSCORES')
112
- else
113
- members = redis.call('zrangebyscore', KEYS[1], min, max, 'WITHSCORES', 'limit', start, count)
114
- end
115
-
116
- local result = {}
117
-
118
- for i = 1, #members, 2 do
119
- local priority = nil
120
- local member = members[i]
121
- local originPriority = nil
122
- if ( members[i+1] + 0 < 0 ) then
123
- originPriority = math.ceil(members[i+1]) * 1000 - members[i+1] * 1000
124
- else
125
- originPriority = math.floor(members[i+1])
126
- end
127
-
128
- if ( score + 0 >= 1000 ) then
129
- priority = -score - originPriority / 1000
130
- elseif ( score + 0 == 0 ) then
131
- priority = originPriority
132
- else
133
- originPriority = score
134
- priority = score
135
- end
136
- redis.call('zadd', KEYS[1], priority, member)
137
- table.insert(result, member)
138
- table.insert(result, originPriority)
139
- end
140
-
141
- return result
142
- """
143
- members = self.execute_lua(lua_script, [key], _min, _max, start, count, score)
144
- return [(members[i].decode(), int(members[i + 1])) for i in range(0, len(members), 2)]
145
-
146
- # def get_member(self):
147
- # with self.get_connection() as client:
148
- # pipeline = client.pipeline()
149
-
150
- def done(self, keys: list, *args) -> list:
151
- lua_script = """
152
- for i, member in ipairs(ARGV) do
153
- redis.call("zrem", KEYS[1], member)
154
- redis.call("sadd", KEYS[2], member)
155
- end
156
- """
157
- self.execute_lua(lua_script, keys, *args)
158
-
159
-
160
-
149
+ execute = self.execute_command("register_script", lua_script)
150
+ return execute(keys=keys, args=args)
@@ -0,0 +1,148 @@
1
+
2
+
3
+
4
+ # 示例用法
5
+ # if __name__ == "__main__":
6
+ # redis_client = RedisClient(
7
+ # host="r-j6c1t3etiefpmz7cwdpd.redis.rds.aliyuncs.com", port=6379,
8
+ # password="SpiderLinux666", db=0
9
+ # )
10
+ #
11
+ # # 执行 Redis 命令
12
+ # try:
13
+ # ss = redis_client.get("host_speed_control:bepls.com")
14
+ # print(f"获取的值: {ss}")
15
+ # except Exception as e:
16
+ # print(f"操作失败: {e}")
17
+
18
+
19
+ import redis
20
+ from cobweb import setting
21
+
22
+
23
+ class RedisDB:
24
+
25
+ def __init__(self, **kwargs):
26
+ redis_config = kwargs or setting.REDIS_CONFIG
27
+ pool = redis.ConnectionPool(**redis_config)
28
+ self._client = redis.Redis(connection_pool=pool)
29
+
30
+ def setnx(self, name, value=""):
31
+ return self._client.setnx(name, value)
32
+
33
+ def setex(self, name, t, value=""):
34
+ return self._client.setex(name, t, value)
35
+
36
+ def expire(self, name, t, nx: bool = False, xx: bool = False, gt: bool = False, lt: bool = False):
37
+ return self._client.expire(name, t, nx, xx, gt, lt)
38
+
39
+ def ttl(self, name):
40
+ return self._client.ttl(name)
41
+
42
+ def delete(self, name):
43
+ return self._client.delete(name)
44
+
45
+ def exists(self, *name) -> bool:
46
+ return self._client.exists(*name)
47
+
48
+ def sadd(self, name, value):
49
+ return self._client.sadd(name, value)
50
+
51
+ def zcard(self, name) -> bool:
52
+ return self._client.zcard(name)
53
+
54
+ def zadd(self, name, item: dict, **kwargs):
55
+ return self._client.zadd(name, item, **kwargs)
56
+
57
+ def zrem(self, name, *value):
58
+ return self._client.zrem(name, *value)
59
+
60
+ def zcount(self, name, _min, _max):
61
+ return self._client.zcount(name, _min, _max)
62
+
63
+ # def zrangebyscore(self, name, _min, _max, start, num, withscores: bool = False, *args):
64
+ # return self._client.zrangebyscore(name, _min, _max, start, num, withscores, *args)
65
+
66
+ def lua(self, script: str, keys: list = None, args: list = None):
67
+ keys = keys or []
68
+ args = args or []
69
+ keys_count = len(keys)
70
+ return self._client.eval(script, keys_count, *keys, *args)
71
+
72
+ def lua_sha(self, sha1: str, keys: list = None, args: list = None):
73
+ keys = keys or []
74
+ args = args or []
75
+ keys_count = len(keys)
76
+ return self._client.evalsha(sha1, keys_count, *keys, *args)
77
+
78
+ def execute_lua(self, lua_script: str, keys: list, *args):
79
+ execute = self._client.register_script(lua_script)
80
+ return execute(keys=keys, args=args)
81
+
82
+ def lock(self, key, t=15) -> bool:
83
+ lua_script = """
84
+ local status = redis.call('setnx', KEYS[1], 1)
85
+ if ( status == 1 ) then
86
+ redis.call('expire', KEYS[1], ARGV[1])
87
+ end
88
+ return status
89
+ """
90
+ status = self.execute_lua(lua_script, [key], t)
91
+ return bool(status)
92
+
93
+ def members(self, key, score, start=0, count=5000, _min="-inf", _max="+inf") -> list:
94
+ lua_script = """
95
+ local min = ARGV[1]
96
+ local max = ARGV[2]
97
+ local start = ARGV[3]
98
+ local count = ARGV[4]
99
+ local score = ARGV[5]
100
+ local members = nil
101
+
102
+ if ( type(count) == string ) then
103
+ members = redis.call('zrangebyscore', KEYS[1], min, max, 'WITHSCORES')
104
+ else
105
+ members = redis.call('zrangebyscore', KEYS[1], min, max, 'WITHSCORES', 'limit', start, count)
106
+ end
107
+
108
+ local result = {}
109
+
110
+ for i = 1, #members, 2 do
111
+ local priority = nil
112
+ local member = members[i]
113
+ local originPriority = nil
114
+ if ( members[i+1] + 0 < 0 ) then
115
+ originPriority = math.ceil(members[i+1]) * 1000 - members[i+1] * 1000
116
+ else
117
+ originPriority = math.floor(members[i+1])
118
+ end
119
+
120
+ if ( score + 0 >= 1000 ) then
121
+ priority = -score - originPriority / 1000
122
+ elseif ( score + 0 == 0 ) then
123
+ priority = originPriority
124
+ else
125
+ originPriority = score
126
+ priority = score
127
+ end
128
+ redis.call('zadd', KEYS[1], priority, member)
129
+ table.insert(result, member)
130
+ table.insert(result, originPriority)
131
+ end
132
+
133
+ return result
134
+ """
135
+ members = self.execute_lua(lua_script, [key], _min, _max, start, count, score)
136
+ return [(members[i].decode(), int(members[i + 1])) for i in range(0, len(members), 2)]
137
+
138
+ def done(self, keys: list, *args) -> list:
139
+ lua_script = """
140
+ for i, member in ipairs(ARGV) do
141
+ redis.call("zrem", KEYS[1], member)
142
+ redis.call("sadd", KEYS[2], member)
143
+ end
144
+ """
145
+ self.execute_lua(lua_script, keys, *args)
146
+
147
+
148
+
@@ -1,6 +1,8 @@
1
1
  import time
2
2
  import threading
3
3
 
4
+ from h5py.h5pl import insert
5
+
4
6
  from cobweb.db import RedisDB
5
7
  from cobweb.base import Seed, logger
6
8
  from cobweb.constant import LogTemplate
@@ -23,9 +25,9 @@ class LauncherPro(Launcher):
23
25
  self._reset_lock_key = "lock:reset:%s_%s" % (project, task)
24
26
 
25
27
  # self._bf_key = "bloom_%s_%s" % (project, task)
26
- #
28
+
27
29
  self._db = RedisDB()
28
- #
30
+
29
31
  # self._bf = BloomFilter(self._bf_key)
30
32
 
31
33
  self._heartbeat_start_event = threading.Event()
@@ -46,9 +48,9 @@ class LauncherPro(Launcher):
46
48
  spider_speed = self._db.get(self._speed_control_key)
47
49
  if int(spider_speed or 0) > self._spider_max_count:
48
50
  expire_time = self._db.ttl(self._speed_control_key)
49
- if expire_time == -1:
51
+ if expire_time <= -1:
50
52
  self._db.delete(self._speed_control_key)
51
- else:
53
+ elif isinstance(expire_time, int):
52
54
  logger.info(f"Too fast! Please wait {expire_time} seconds...")
53
55
  time.sleep(expire_time / 2)
54
56
  return None
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: cobweb-launcher
3
- Version: 1.2.57
3
+ Version: 1.2.58
4
4
  Summary: spider_hole
5
5
  Home-page: https://github.com/Juannie-PP/cobweb
6
6
  Author: Juannie-PP
@@ -17,14 +17,15 @@ cobweb/crawlers/crawler.py,sha256=pePDGroD6JJAht5QTU51L7MkFIY4ob9TKpznZ2wUmsw,89
17
17
  cobweb/crawlers/file_crawler.py,sha256=2Sjbdgxzqd41WykKUQE3QQlGai3T8k-pmHNmPlTchjQ,4454
18
18
  cobweb/db/__init__.py,sha256=uZwSkd105EAwYo95oZQXAfofUKHVIAZZIPpNMy-hm2Q,56
19
19
  cobweb/db/api_db.py,sha256=bDc5dJQxq4z04h70KUTHd0OqUOEY7Cm3wcNJZtTvJIM,3015
20
- cobweb/db/redis_db.py,sha256=ODV_p00TOQb7hvzR1fxFFOFryPL_VxkezdCcFgVKb0s,5397
20
+ cobweb/db/redis_db.py,sha256=7lnEbPjfyvWuuP2f9hZAfKxpK31eJCoDAB5wfNkds34,5495
21
+ cobweb/db/redis_db_new.py,sha256=F09LWVjtC2JFdCaKatZ2bAOLKbsnes85_nZRe2dtSIc,4697
21
22
  cobweb/exceptions/__init__.py,sha256=E9SHnJBbhD7fOgPFMswqyOf8SKRDrI_i25L0bSpohvk,32
22
23
  cobweb/exceptions/oss_db_exception.py,sha256=iP_AImjNHT3-Iv49zCFQ3rdLnlvuHa3h2BXApgrOYpA,636
23
24
  cobweb/launchers/__init__.py,sha256=qMuVlQcjErVK67HyKFZEsXf_rfZD5ODjx1QucSCKMOM,114
24
25
  cobweb/launchers/launcher.py,sha256=y1a72sANV-oJVpy_BI7BwKy7fY4AnpHqJK3t6czoCts,7896
25
26
  cobweb/launchers/launcher_air.py,sha256=KAk_M8F3029cXYe7m4nn3Nzyi89lbxJ2cqZjqW8iZ0E,2832
26
27
  cobweb/launchers/launcher_api.py,sha256=7K7Kl3dk7Ung9iRBwhiMrALEJywcR66ie5RIkLQEM-Y,7909
27
- cobweb/launchers/launcher_pro.py,sha256=_KK0KlrzDaQZOdTQJoPZcBsoAiWF13CSbvoepahXIpU,8054
28
+ cobweb/launchers/launcher_pro.py,sha256=EuTsa6ErqpqytdnWhQxHFhO6nXK1V9huvtAAKc_5a6U,8095
28
29
  cobweb/pipelines/__init__.py,sha256=zSUsGtx6smbs2iXBXvYynReKSgky-3gjqaAtKVnA_OU,105
29
30
  cobweb/pipelines/pipeline.py,sha256=4TJLX0sUHRxYndF5A4Vs5btUGI-wigkOcFvhTW1hLXI,2009
30
31
  cobweb/pipelines/pipeline_console.py,sha256=NEh-4zhuVAQOqwXLsqeb-rcNZ9_KXFUpL3otUTL5qBs,754
@@ -37,8 +38,8 @@ cobweb/utils/bloom.py,sha256=vng-YbKgh9HbtpAWYf_nkUSbfVTOj40aqUUejRYlsCU,1752
37
38
  cobweb/utils/dotting.py,sha256=mVICaa26R-dQ4JGmPK-kkR6QjX38QiRewXZnGb2DCIc,1784
38
39
  cobweb/utils/oss.py,sha256=gyt8-UB07tVphZLQXMOf-JTJwU-mWq8KZkOXKkAf3uk,3513
39
40
  cobweb/utils/tools.py,sha256=5JEaaAwYoV9Sdla2UBIJn6faUBuXmxUMagm9ck6FVqs,1253
40
- cobweb_launcher-1.2.57.dist-info/LICENSE,sha256=z1rxSIGOyzcSb3orZxFPxzx-0C1vTocmswqBNxpKfEk,1063
41
- cobweb_launcher-1.2.57.dist-info/METADATA,sha256=MZ_FzPMBpEfvCRbDFSCbqwHB2VgXXNKB8mrpc9QhHRg,6510
42
- cobweb_launcher-1.2.57.dist-info/WHEEL,sha256=ewwEueio1C2XeHTvT17n8dZUJgOvyCWCt0WVNLClP9o,92
43
- cobweb_launcher-1.2.57.dist-info/top_level.txt,sha256=4GETBGNsKqiCUezmT-mJn7tjhcDlu7nLIV5gGgHBW4I,7
44
- cobweb_launcher-1.2.57.dist-info/RECORD,,
41
+ cobweb_launcher-1.2.58.dist-info/LICENSE,sha256=z1rxSIGOyzcSb3orZxFPxzx-0C1vTocmswqBNxpKfEk,1063
42
+ cobweb_launcher-1.2.58.dist-info/METADATA,sha256=QH36iouuBHu1S7g9-57Zek9aYa0CiEu7aIN7YOoNjzs,6510
43
+ cobweb_launcher-1.2.58.dist-info/WHEEL,sha256=ewwEueio1C2XeHTvT17n8dZUJgOvyCWCt0WVNLClP9o,92
44
+ cobweb_launcher-1.2.58.dist-info/top_level.txt,sha256=4GETBGNsKqiCUezmT-mJn7tjhcDlu7nLIV5gGgHBW4I,7
45
+ cobweb_launcher-1.2.58.dist-info/RECORD,,