lazysdk 0.1.32__tar.gz → 0.1.34__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.
- {lazysdk-0.1.32 → lazysdk-0.1.34}/PKG-INFO +1 -1
- {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazyfile.py +1 -1
- lazysdk-0.1.34/lazysdk/lazyprocess.py +180 -0
- lazysdk-0.1.34/lazysdk/lazyurl.py +35 -0
- {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk.egg-info/PKG-INFO +1 -1
- {lazysdk-0.1.32 → lazysdk-0.1.34}/setup.py +1 -1
- lazysdk-0.1.32/lazysdk/lazyprocess.py +0 -133
- lazysdk-0.1.32/lazysdk/lazyurl.py +0 -14
- {lazysdk-0.1.32 → lazysdk-0.1.34}/README.md +0 -0
- {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/__init__.py +0 -0
- {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazyCrypto.py +0 -0
- {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazy_id_card.py +0 -0
- {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazybase64.py +0 -0
- {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazydict.py +0 -0
- {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazyenv.py +0 -0
- {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazyexcel.py +0 -0
- {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazyflask.py +0 -0
- {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazyid.py +0 -0
- {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazyip.py +0 -0
- {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazym3u8.py +0 -0
- {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazymd5.py +0 -0
- {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazypath.py +0 -0
- {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazyproxies.py +0 -0
- {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazyrandom.py +0 -0
- {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazyredis.py +0 -0
- {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazyrequests.py +0 -0
- {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazytext.py +0 -0
- {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazytime.py +0 -0
- {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazyua.py +0 -0
- {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazywebhook.py +0 -0
- {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk.egg-info/SOURCES.txt +0 -0
- {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk.egg-info/dependency_links.txt +0 -0
- {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk.egg-info/requires.txt +0 -0
- {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk.egg-info/top_level.txt +0 -0
- {lazysdk-0.1.32 → lazysdk-0.1.34}/setup.cfg +0 -0
@@ -0,0 +1,180 @@
|
|
1
|
+
#!/usr/bin/env python3
|
2
|
+
# coding = utf8
|
3
|
+
"""
|
4
|
+
@ Author : ZeroSeeker
|
5
|
+
@ e-mail : zeroseeker@foxmail.com
|
6
|
+
@ GitHub : https://github.com/ZeroSeeker
|
7
|
+
@ Gitee : https://gitee.com/ZeroSeeker
|
8
|
+
"""
|
9
|
+
from multiprocessing import Process
|
10
|
+
from multiprocessing import Queue
|
11
|
+
import showlog
|
12
|
+
import time
|
13
|
+
import copy
|
14
|
+
import os
|
15
|
+
os_cpu_count = os.cpu_count() # CPU核心数
|
16
|
+
|
17
|
+
|
18
|
+
def run(
|
19
|
+
task_list: list,
|
20
|
+
task_function,
|
21
|
+
subprocess_keep: bool = False,
|
22
|
+
subprocess_limit: int = None,
|
23
|
+
master_process_delay: int = 1,
|
24
|
+
return_data: bool = False,
|
25
|
+
silence: bool = False
|
26
|
+
):
|
27
|
+
"""
|
28
|
+
多进程 进程控制
|
29
|
+
:param task_list: 任务列表,list格式,会将list中的每个元素传入给task_function中的task_info,作为任务的详细信息;
|
30
|
+
:param task_function: 子任务的function,需提前写好,入参为:(task_index, task_info),例如:task_function(task_index, task_info)
|
31
|
+
:param subprocess_keep: 是否保持子进程,True为保持进程,死掉会自动重启;False为不保持,自然退出
|
32
|
+
:param subprocess_limit: 进程数限制,0为无限制,否则按照设定的数量限制并行的子进程数量
|
33
|
+
:param master_process_delay: 主进程循环延时,单位为秒,默认为1秒
|
34
|
+
:param return_data: 是否返回数据,True返回,False不返回
|
35
|
+
:param silence: 静默模式,为True是不产生任何提示
|
36
|
+
|
37
|
+
demo:
|
38
|
+
def task_function(
|
39
|
+
task_index,
|
40
|
+
task_info
|
41
|
+
):
|
42
|
+
# 进程详细的内容
|
43
|
+
print(task_index, task_info)
|
44
|
+
"""
|
45
|
+
inner_task_list = copy.deepcopy(task_list) # 深度拷贝,防止篡改
|
46
|
+
if subprocess_limit:
|
47
|
+
# 存在自定义的子进程数量限制,将采用
|
48
|
+
pass
|
49
|
+
else:
|
50
|
+
# 不存在自定义的子进程数量限制,将使用默认计算方式
|
51
|
+
if os_cpu_count > 1:
|
52
|
+
# 如果cpu核心数大于1个
|
53
|
+
subprocess_limit = os_cpu_count - 1 # 子进程数设置为cpu核心数减1
|
54
|
+
else:
|
55
|
+
# 如果cpu核心数等于1个
|
56
|
+
subprocess_limit = 1
|
57
|
+
active_process = dict() # 存放活跃进程进程,以task_index为key,进程信息为value的dict
|
58
|
+
total_task_num = len(inner_task_list) # 总任务数量
|
59
|
+
task_index_start = 0 # 用来计算启动的累计进程数
|
60
|
+
if return_data:
|
61
|
+
q = Queue() # 生成一个队列对象,以实现进程通信
|
62
|
+
else:
|
63
|
+
pass
|
64
|
+
|
65
|
+
if silence:
|
66
|
+
pass
|
67
|
+
else:
|
68
|
+
showlog.info(f'正在准备多进程执行任务,总任务数为:{total_task_num},进程数限制为:{subprocess_limit}...')
|
69
|
+
# 创建并启动进程
|
70
|
+
while True:
|
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
|
+
# 当前活跃进程数量达到子进程数限制,本次循环不再新增进程,跳出
|
76
|
+
if silence is False:
|
77
|
+
showlog.warning(f'达到子进程数限制:{subprocess_limit}')
|
78
|
+
break
|
79
|
+
else:
|
80
|
+
# 未达到进程数限制
|
81
|
+
if task_index in active_process.keys():
|
82
|
+
# 进程已存在,不重复创建,跳过
|
83
|
+
continue
|
84
|
+
else:
|
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 # 记录累计开启进程数
|
111
|
+
|
112
|
+
# 检测非活跃进程,并从active_process中剔除非活跃进程,以便开启新的进程
|
113
|
+
inactive_process_temp = list() # 非活跃进程
|
114
|
+
for process_index, process_info in active_process.items():
|
115
|
+
# print(q.qsize())
|
116
|
+
# print(q.get())
|
117
|
+
# print(q.get_nowait())
|
118
|
+
if process_info['process'].is_alive() is True:
|
119
|
+
# 该子进程仍然运行
|
120
|
+
continue
|
121
|
+
else:
|
122
|
+
# 该子进程停止运行
|
123
|
+
if silence is False:
|
124
|
+
showlog.warning(f'进程 {process_index} 不活跃,将被剔除...')
|
125
|
+
inactive_process_temp.append(process_index)
|
126
|
+
# 尝试终止进程
|
127
|
+
process_info['process'].terminate()
|
128
|
+
process_info['process'].join()
|
129
|
+
|
130
|
+
if inactive_process_temp:
|
131
|
+
# 存在需要剔除的子进程
|
132
|
+
for each_dead_process in inactive_process_temp:
|
133
|
+
active_process.pop(each_dead_process)
|
134
|
+
else:
|
135
|
+
# 不存在需要剔除的子进程
|
136
|
+
pass
|
137
|
+
|
138
|
+
showlog.info(f'>> 当前活跃进程数:{len(active_process.keys())}')
|
139
|
+
|
140
|
+
if task_index_start >= len(inner_task_list) and len(active_process.keys()) == 0:
|
141
|
+
if silence is False:
|
142
|
+
showlog.info('全部任务执行完成')
|
143
|
+
if subprocess_keep is True:
|
144
|
+
task_index_start = 0 # 将累计启动进程数重置为0
|
145
|
+
else:
|
146
|
+
return
|
147
|
+
else:
|
148
|
+
pass
|
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
|
+
)
|
@@ -0,0 +1,35 @@
|
|
1
|
+
import urllib.parse as urlparse
|
2
|
+
|
3
|
+
|
4
|
+
def get_url_params(
|
5
|
+
url: str
|
6
|
+
):
|
7
|
+
"""
|
8
|
+
获取url的params参数,返回dict形式
|
9
|
+
"""
|
10
|
+
params_str = urlparse.urlsplit(url).query
|
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
|
@@ -1,133 +0,0 @@
|
|
1
|
-
#!/usr/bin/env python3
|
2
|
-
# coding = utf8
|
3
|
-
"""
|
4
|
-
@ Author : ZeroSeeker
|
5
|
-
@ e-mail : zeroseeker@foxmail.com
|
6
|
-
@ GitHub : https://github.com/ZeroSeeker
|
7
|
-
@ Gitee : https://gitee.com/ZeroSeeker
|
8
|
-
"""
|
9
|
-
from multiprocessing import Process
|
10
|
-
from multiprocessing import Queue
|
11
|
-
import showlog
|
12
|
-
import time
|
13
|
-
import copy
|
14
|
-
import os
|
15
|
-
os_cpu_count = os.cpu_count() # CPU核心数
|
16
|
-
|
17
|
-
|
18
|
-
def run(
|
19
|
-
task_list: list,
|
20
|
-
task_function,
|
21
|
-
subprocess_keep: bool = False,
|
22
|
-
subprocess_limit: int = None,
|
23
|
-
master_process_delay: int = 1,
|
24
|
-
return_data: bool = False,
|
25
|
-
|
26
|
-
silence: bool = False
|
27
|
-
):
|
28
|
-
"""
|
29
|
-
多进程 进程控制
|
30
|
-
:param task_list: 任务列表,list格式
|
31
|
-
:param task_function: 子任务的function,需提前写好,入参为:(task_index, task_info),例如:task_function(task_index, task_info)
|
32
|
-
:param subprocess_keep: 是否保持子进程,True为保持进程,死掉会自动重启;False为不保持,自然退出
|
33
|
-
:param subprocess_limit: 进程数限制,0为无限制,否则按照设定的数量限制并行的子进程数量
|
34
|
-
:param master_process_delay: 主进程循环延时,单位为秒,默认为1秒
|
35
|
-
:param return_data: 是否返回数据,True返回,False不返回
|
36
|
-
:param silence: 静默模式,为True是不产生任何提示
|
37
|
-
|
38
|
-
demo:
|
39
|
-
def task_function(
|
40
|
-
task_index,
|
41
|
-
task_info
|
42
|
-
):
|
43
|
-
# 进程详细的内容
|
44
|
-
print(task_index, task_info)
|
45
|
-
"""
|
46
|
-
if subprocess_limit:
|
47
|
-
pass
|
48
|
-
else:
|
49
|
-
if os_cpu_count > 1:
|
50
|
-
subprocess_limit = os_cpu_count - 1 # 进程数设置为cpu核心数减1
|
51
|
-
else:
|
52
|
-
subprocess_limit = 1
|
53
|
-
active_process = dict() # 活跃进程,存放进程,以task_index为key,进程信息为value的dict
|
54
|
-
task_count = len(task_list) # 总任务数量
|
55
|
-
task_index_start = 0 # 用来计算启动的累计进程数
|
56
|
-
q = Queue() # 生成一个队列对象,以实现进程通信
|
57
|
-
|
58
|
-
showlog.info(f'正在准备多进程执行任务,总任务数为:{task_count},进程数限制为:{subprocess_limit}...')
|
59
|
-
# 创建并启动线程
|
60
|
-
while True:
|
61
|
-
this_time_start = copy.deepcopy(task_index_start) # 确定本次循环的起点任务序号
|
62
|
-
for task_index in range(this_time_start, task_count): # 按照任务量遍历
|
63
|
-
if task_index in active_process.keys():
|
64
|
-
# 进程已存在,不重复创建,跳过
|
65
|
-
continue
|
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
|
-
# 不存在子进程限制规则/当前活跃进程数量未达到进程数限制,将开启一个新进程
|
81
|
-
if silence is False:
|
82
|
-
showlog.info(f'发现需要开启的进程:{task_index}')
|
83
|
-
task_info = task_list[task_index] # 提取将开启的进程的任务内容
|
84
|
-
# ---------- 开启进程 ----------
|
85
|
-
if return_data is True:
|
86
|
-
p = Process(
|
87
|
-
target=task_function,
|
88
|
-
args=(task_index, task_info, q)
|
89
|
-
)
|
90
|
-
else:
|
91
|
-
p = Process(
|
92
|
-
target=task_function,
|
93
|
-
args=(task_index, task_info)
|
94
|
-
)
|
95
|
-
p.start()
|
96
|
-
# ---------- 开启进程 ----------
|
97
|
-
active_process[task_index] = {
|
98
|
-
'task_index': task_index, # 任务序号
|
99
|
-
'task_info': task_info, # 任务详情
|
100
|
-
'process': p, # 进程对象
|
101
|
-
} # 记录开启的进程
|
102
|
-
if silence is False:
|
103
|
-
showlog.info(f'进程:{task_index} 已开启')
|
104
|
-
task_index_start += 1 # 记录累计开启进程数
|
105
|
-
|
106
|
-
# 检测非活跃进程,并从active_process中剔除非活跃进程,以便开启新的进程
|
107
|
-
inactive_process_temp = list() # 非活跃进程
|
108
|
-
for process_index, process_info in active_process.items():
|
109
|
-
# print(q.qsize())
|
110
|
-
# print(q.get())
|
111
|
-
# print(q.get_nowait())
|
112
|
-
if process_info['process'].is_alive() is False:
|
113
|
-
if silence is False:
|
114
|
-
showlog.warning(f'进程 {process_index} 不活跃,将被剔除...')
|
115
|
-
inactive_process_temp.append(process_index)
|
116
|
-
if inactive_process_temp:
|
117
|
-
for each_dead_process in inactive_process_temp:
|
118
|
-
active_process.pop(each_dead_process)
|
119
|
-
else:
|
120
|
-
pass
|
121
|
-
|
122
|
-
showlog.info(f'>> 当前活跃进程数:{len(active_process.keys())}')
|
123
|
-
|
124
|
-
if task_index_start >= len(task_list) and len(active_process.keys()) == 0:
|
125
|
-
if silence is False:
|
126
|
-
showlog.info('全部任务执行完成')
|
127
|
-
if subprocess_keep is True:
|
128
|
-
task_index_start = 0 # 将累计启动进程数重置为0
|
129
|
-
else:
|
130
|
-
return
|
131
|
-
else:
|
132
|
-
pass
|
133
|
-
time.sleep(master_process_delay)
|
@@ -1,14 +0,0 @@
|
|
1
|
-
import urllib.parse as urlparse
|
2
|
-
|
3
|
-
|
4
|
-
def get_url_params(url):
|
5
|
-
"""
|
6
|
-
获取url的params参数,返回dict形式
|
7
|
-
"""
|
8
|
-
params_str = urlparse.urlsplit(url).query
|
9
|
-
params_str_split = params_str.split('&')
|
10
|
-
params_dict = dict()
|
11
|
-
for each in params_str_split:
|
12
|
-
each_split = each.split('=', maxsplit=1)
|
13
|
-
params_dict[each_split[0]] = each_split[1]
|
14
|
-
return params_dict
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|
File without changes
|