lazysdk 0.1.32__py3-none-any.whl → 0.1.34__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.
- lazysdk/lazyfile.py +1 -1
- lazysdk/lazyprocess.py +99 -52
- lazysdk/lazyurl.py +28 -7
- {lazysdk-0.1.32.dist-info → lazysdk-0.1.34.dist-info}/METADATA +1 -1
- {lazysdk-0.1.32.dist-info → lazysdk-0.1.34.dist-info}/RECORD +7 -7
- {lazysdk-0.1.32.dist-info → lazysdk-0.1.34.dist-info}/WHEEL +0 -0
- {lazysdk-0.1.32.dist-info → lazysdk-0.1.34.dist-info}/top_level.txt +0 -0
lazysdk/lazyfile.py
CHANGED
lazysdk/lazyprocess.py
CHANGED
@@ -22,12 +22,11 @@ def run(
|
|
22
22
|
subprocess_limit: int = None,
|
23
23
|
master_process_delay: int = 1,
|
24
24
|
return_data: bool = False,
|
25
|
-
|
26
25
|
silence: bool = False
|
27
26
|
):
|
28
27
|
"""
|
29
28
|
多进程 进程控制
|
30
|
-
:param task_list: 任务列表,list
|
29
|
+
:param task_list: 任务列表,list格式,会将list中的每个元素传入给task_function中的task_info,作为任务的详细信息;
|
31
30
|
:param task_function: 子任务的function,需提前写好,入参为:(task_index, task_info),例如:task_function(task_index, task_info)
|
32
31
|
:param subprocess_keep: 是否保持子进程,True为保持进程,死掉会自动重启;False为不保持,自然退出
|
33
32
|
:param subprocess_limit: 进程数限制,0为无限制,否则按照设定的数量限制并行的子进程数量
|
@@ -43,65 +42,72 @@ def run(
|
|
43
42
|
# 进程详细的内容
|
44
43
|
print(task_index, task_info)
|
45
44
|
"""
|
45
|
+
inner_task_list = copy.deepcopy(task_list) # 深度拷贝,防止篡改
|
46
46
|
if subprocess_limit:
|
47
|
+
# 存在自定义的子进程数量限制,将采用
|
47
48
|
pass
|
48
49
|
else:
|
50
|
+
# 不存在自定义的子进程数量限制,将使用默认计算方式
|
49
51
|
if os_cpu_count > 1:
|
50
|
-
|
52
|
+
# 如果cpu核心数大于1个
|
53
|
+
subprocess_limit = os_cpu_count - 1 # 子进程数设置为cpu核心数减1
|
51
54
|
else:
|
55
|
+
# 如果cpu核心数等于1个
|
52
56
|
subprocess_limit = 1
|
53
|
-
active_process = dict() #
|
54
|
-
|
57
|
+
active_process = dict() # 存放活跃进程进程,以task_index为key,进程信息为value的dict
|
58
|
+
total_task_num = len(inner_task_list) # 总任务数量
|
55
59
|
task_index_start = 0 # 用来计算启动的累计进程数
|
56
|
-
|
60
|
+
if return_data:
|
61
|
+
q = Queue() # 生成一个队列对象,以实现进程通信
|
62
|
+
else:
|
63
|
+
pass
|
57
64
|
|
58
|
-
|
59
|
-
|
65
|
+
if silence:
|
66
|
+
pass
|
67
|
+
else:
|
68
|
+
showlog.info(f'正在准备多进程执行任务,总任务数为:{total_task_num},进程数限制为:{subprocess_limit}...')
|
69
|
+
# 创建并启动进程
|
60
70
|
while True:
|
61
|
-
this_time_start = copy.deepcopy(task_index_start) #
|
62
|
-
for task_index in range(this_time_start,
|
63
|
-
|
64
|
-
|
65
|
-
|
66
|
-
else:
|
67
|
-
# 进程不存在,待定
|
68
|
-
if subprocess_limit > 0:
|
69
|
-
# 存在子进程数量限制规则,待定
|
70
|
-
if len(active_process.keys()) >= subprocess_limit:
|
71
|
-
# 当前活跃进程数量达到子进程数限制,本次循环不再新增进程,跳出
|
72
|
-
if silence is False:
|
73
|
-
showlog.warning('达到进程数限制')
|
74
|
-
break
|
75
|
-
else:
|
76
|
-
# 未达到进程数限制
|
77
|
-
pass
|
78
|
-
else:
|
79
|
-
pass
|
80
|
-
# 不存在子进程限制规则/当前活跃进程数量未达到进程数限制,将开启一个新进程
|
71
|
+
this_time_start = copy.deepcopy(task_index_start) # 深度拷贝累积启动的进程数,以确定本次循环的起点任务序号,假设subprocess_keep为False
|
72
|
+
for task_index in range(this_time_start, total_task_num): # 按照任务量遍历
|
73
|
+
# 判断是否需要创建新的子进程
|
74
|
+
if len(active_process.keys()) >= subprocess_limit:
|
75
|
+
# 当前活跃进程数量达到子进程数限制,本次循环不再新增进程,跳出
|
81
76
|
if silence is False:
|
82
|
-
showlog.
|
83
|
-
|
84
|
-
|
85
|
-
|
86
|
-
|
87
|
-
|
88
|
-
|
89
|
-
)
|
77
|
+
showlog.warning(f'达到子进程数限制:{subprocess_limit}')
|
78
|
+
break
|
79
|
+
else:
|
80
|
+
# 未达到进程数限制
|
81
|
+
if task_index in active_process.keys():
|
82
|
+
# 进程已存在,不重复创建,跳过
|
83
|
+
continue
|
90
84
|
else:
|
91
|
-
|
92
|
-
|
93
|
-
|
94
|
-
|
95
|
-
|
96
|
-
|
97
|
-
|
98
|
-
|
99
|
-
|
100
|
-
|
101
|
-
|
102
|
-
|
103
|
-
|
104
|
-
|
85
|
+
# 进程不存在,待定
|
86
|
+
# 不存在子进程限制规则/当前活跃进程数量未达到进程数限制,将开启一个新进程
|
87
|
+
if silence is False:
|
88
|
+
showlog.info(f'发现需要开启的子进程:{task_index}/{total_task_num}')
|
89
|
+
task_info = inner_task_list[task_index] # 提取将开启的进程的任务内容
|
90
|
+
# ---------- 开启进程 ----------
|
91
|
+
if return_data is True:
|
92
|
+
p = Process(
|
93
|
+
target=task_function,
|
94
|
+
args=(task_index, task_info, q)
|
95
|
+
)
|
96
|
+
else:
|
97
|
+
p = Process(
|
98
|
+
target=task_function,
|
99
|
+
args=(task_index, task_info)
|
100
|
+
)
|
101
|
+
p.start()
|
102
|
+
# ---------- 开启进程 ----------
|
103
|
+
active_process[task_index] = {
|
104
|
+
'task_index': task_index, # 任务序号
|
105
|
+
'task_info': task_info, # 任务详情
|
106
|
+
'process': p, # 进程对象
|
107
|
+
} # 记录开启的进程
|
108
|
+
if silence is False:
|
109
|
+
showlog.info(f'子进程:{task_index}/{total_task_num} 已开启')
|
110
|
+
task_index_start += 1 # 记录累计开启进程数
|
105
111
|
|
106
112
|
# 检测非活跃进程,并从active_process中剔除非活跃进程,以便开启新的进程
|
107
113
|
inactive_process_temp = list() # 非活跃进程
|
@@ -109,19 +115,29 @@ def run(
|
|
109
115
|
# print(q.qsize())
|
110
116
|
# print(q.get())
|
111
117
|
# print(q.get_nowait())
|
112
|
-
if process_info['process'].is_alive() is
|
118
|
+
if process_info['process'].is_alive() is True:
|
119
|
+
# 该子进程仍然运行
|
120
|
+
continue
|
121
|
+
else:
|
122
|
+
# 该子进程停止运行
|
113
123
|
if silence is False:
|
114
124
|
showlog.warning(f'进程 {process_index} 不活跃,将被剔除...')
|
115
125
|
inactive_process_temp.append(process_index)
|
126
|
+
# 尝试终止进程
|
127
|
+
process_info['process'].terminate()
|
128
|
+
process_info['process'].join()
|
129
|
+
|
116
130
|
if inactive_process_temp:
|
131
|
+
# 存在需要剔除的子进程
|
117
132
|
for each_dead_process in inactive_process_temp:
|
118
133
|
active_process.pop(each_dead_process)
|
119
134
|
else:
|
135
|
+
# 不存在需要剔除的子进程
|
120
136
|
pass
|
121
137
|
|
122
138
|
showlog.info(f'>> 当前活跃进程数:{len(active_process.keys())}')
|
123
139
|
|
124
|
-
if task_index_start >= len(
|
140
|
+
if task_index_start >= len(inner_task_list) and len(active_process.keys()) == 0:
|
125
141
|
if silence is False:
|
126
142
|
showlog.info('全部任务执行完成')
|
127
143
|
if subprocess_keep is True:
|
@@ -131,3 +147,34 @@ def run(
|
|
131
147
|
else:
|
132
148
|
pass
|
133
149
|
time.sleep(master_process_delay)
|
150
|
+
|
151
|
+
|
152
|
+
def task_function_demo(
|
153
|
+
task_index,
|
154
|
+
task_info,
|
155
|
+
q=None
|
156
|
+
):
|
157
|
+
print(task_index, task_info)
|
158
|
+
time.sleep(5)
|
159
|
+
q.put(task_index)
|
160
|
+
|
161
|
+
|
162
|
+
if __name__ == '__main__':
|
163
|
+
task_list_demo = [
|
164
|
+
{'task_id': 1},
|
165
|
+
{'task_id': 2},
|
166
|
+
{'task_id': 3},
|
167
|
+
{'task_id': 4},
|
168
|
+
{'task_id': 5},
|
169
|
+
{'task_id': 6},
|
170
|
+
{'task_id': 7},
|
171
|
+
{'task_id': 8},
|
172
|
+
{'task_id': 9},
|
173
|
+
{'task_id': 10},
|
174
|
+
{'task_id': 11},
|
175
|
+
]
|
176
|
+
run(
|
177
|
+
task_list=task_list_demo,
|
178
|
+
task_function=task_function_demo,
|
179
|
+
return_data=True
|
180
|
+
)
|
lazysdk/lazyurl.py
CHANGED
@@ -1,14 +1,35 @@
|
|
1
1
|
import urllib.parse as urlparse
|
2
2
|
|
3
3
|
|
4
|
-
def get_url_params(
|
4
|
+
def get_url_params(
|
5
|
+
url: str
|
6
|
+
):
|
5
7
|
"""
|
6
8
|
获取url的params参数,返回dict形式
|
7
9
|
"""
|
8
10
|
params_str = urlparse.urlsplit(url).query
|
9
|
-
|
10
|
-
|
11
|
-
|
12
|
-
|
13
|
-
|
14
|
-
|
11
|
+
if params_str:
|
12
|
+
params_str_split = params_str.split('&')
|
13
|
+
params_dict = dict()
|
14
|
+
for each in params_str_split:
|
15
|
+
each_split = each.split('=', maxsplit=1)
|
16
|
+
params_dict[each_split[0]] = each_split[1]
|
17
|
+
return params_dict
|
18
|
+
else:
|
19
|
+
return
|
20
|
+
|
21
|
+
|
22
|
+
def url_info(
|
23
|
+
url: str
|
24
|
+
):
|
25
|
+
url_info_dict = dict()
|
26
|
+
url_info_dict['url'] = url
|
27
|
+
if url:
|
28
|
+
urlparse_obj = urlparse.urlsplit(url)
|
29
|
+
url_info_dict['host'] = urlparse_obj.hostname # 域名
|
30
|
+
url_info_dict['path'] = urlparse_obj.path # 路径
|
31
|
+
url_info_dict['scheme'] = urlparse_obj.scheme # 协议
|
32
|
+
url_info_dict['params'] = get_url_params(url)
|
33
|
+
else:
|
34
|
+
pass
|
35
|
+
return url_info_dict
|
@@ -5,14 +5,14 @@ lazysdk/lazybase64.py,sha256=KUes0YYmC29y6wF79KWMLV4a7r89Kh3mc10JQvoIY7E,555
|
|
5
5
|
lazysdk/lazydict.py,sha256=uPc0YtLrFtBskLooChUbjapfjJ27HNG92cFRqGiTxdQ,7636
|
6
6
|
lazysdk/lazyenv.py,sha256=P6HjO9cbBPzHD_Vs-Ww_GThDq-h9Wn31VSiu9OzTNWI,3024
|
7
7
|
lazysdk/lazyexcel.py,sha256=r8_VbCzB1dRhMbK4Dwk-cr5keJCo6AV4r8SYe4O5y6k,15129
|
8
|
-
lazysdk/lazyfile.py,sha256=
|
8
|
+
lazysdk/lazyfile.py,sha256=VgecarqYVii0fqTdjkmHXrdhN_-9HYT0kdU17XGBwAI,20806
|
9
9
|
lazysdk/lazyflask.py,sha256=VUhJqtNz_evVyGOS40FKkkQWWrqGEUZ26cv1RQxS388,727
|
10
10
|
lazysdk/lazyid.py,sha256=pEmRpN78-6vdz4hzLxgoCSHJw6gvnOVQyNjqusZZLQE,607
|
11
11
|
lazysdk/lazyip.py,sha256=ZM4N0nCimW4r4z1_Bymb-ZAfabR_3L-hB5Biyyz77-I,451
|
12
12
|
lazysdk/lazym3u8.py,sha256=Gd40ZFRrEj2HAAvGzfC5g390Jk7o6pnptDfsNRV0Vjc,31939
|
13
13
|
lazysdk/lazymd5.py,sha256=JSKIcUmH2zwPDDJAd9XajTYd59eKidoKAkLLNU8OHM4,1112
|
14
14
|
lazysdk/lazypath.py,sha256=Y21B4yHePdclSnp5HghKhlJv-YcCCbz2HMmzP4ZcRUY,6622
|
15
|
-
lazysdk/lazyprocess.py,sha256=
|
15
|
+
lazysdk/lazyprocess.py,sha256=ZVCWOcRYYlUm5NJVb4h8g49xra9omY9oWEQtb8W_RuE,7203
|
16
16
|
lazysdk/lazyproxies.py,sha256=bljLKkP3WksZ6jOHhjS5-jSHdUBRH6gx-BxEZTPJeXc,546
|
17
17
|
lazysdk/lazyrandom.py,sha256=XZ8hTcNvc68FAI-BfaIt7QpCmzZ7m4RGDrfpy_U7zTw,1420
|
18
18
|
lazysdk/lazyredis.py,sha256=78jM_tXNgUKULcp08CQEHmfAlzwlWuOsl6SuLwoLDdM,37918
|
@@ -20,9 +20,9 @@ lazysdk/lazyrequests.py,sha256=hLVbzoaT10DJhpNwrZfGfCioEy02CAUqD7EGkb3V_Eo,2848
|
|
20
20
|
lazysdk/lazytext.py,sha256=dKnRZau2VTn6up0krOhmMSPAF5Uf7IEMsTH3D5w9Hac,1828
|
21
21
|
lazysdk/lazytime.py,sha256=lOQ5U8iWa9dp1ZJ8SjfZ2FRBj9t43SsteYbxDcXkFzo,23199
|
22
22
|
lazysdk/lazyua.py,sha256=QI4EgZAMF9AqXJJvaDEzsMSTbsR47_y8CkJkfPbX-kM,3783
|
23
|
-
lazysdk/lazyurl.py,sha256=
|
23
|
+
lazysdk/lazyurl.py,sha256=YexBUKue1w7pl22RCcHPZPOfYeE6z4yB69pIenM52Xw,921
|
24
24
|
lazysdk/lazywebhook.py,sha256=HwJIZ5j3wUpnEfPkFY-Xq9T_9xdhCJ71dYsWNX22_3Y,8386
|
25
|
-
lazysdk-0.1.
|
26
|
-
lazysdk-0.1.
|
27
|
-
lazysdk-0.1.
|
28
|
-
lazysdk-0.1.
|
25
|
+
lazysdk-0.1.34.dist-info/METADATA,sha256=28S0w8RHV0wFd5fQA_4IfHxWFfhFFma2rr41G7HUlS8,1733
|
26
|
+
lazysdk-0.1.34.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
|
27
|
+
lazysdk-0.1.34.dist-info/top_level.txt,sha256=--bGS42ZHUhVeO83y1wfvKFg6OjkTLxQ4V4riqPQljY,8
|
28
|
+
lazysdk-0.1.34.dist-info/RECORD,,
|
File without changes
|
File without changes
|