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.
Files changed (35) hide show
  1. {lazysdk-0.1.32 → lazysdk-0.1.34}/PKG-INFO +1 -1
  2. {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazyfile.py +1 -1
  3. lazysdk-0.1.34/lazysdk/lazyprocess.py +180 -0
  4. lazysdk-0.1.34/lazysdk/lazyurl.py +35 -0
  5. {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk.egg-info/PKG-INFO +1 -1
  6. {lazysdk-0.1.32 → lazysdk-0.1.34}/setup.py +1 -1
  7. lazysdk-0.1.32/lazysdk/lazyprocess.py +0 -133
  8. lazysdk-0.1.32/lazysdk/lazyurl.py +0 -14
  9. {lazysdk-0.1.32 → lazysdk-0.1.34}/README.md +0 -0
  10. {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/__init__.py +0 -0
  11. {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazyCrypto.py +0 -0
  12. {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazy_id_card.py +0 -0
  13. {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazybase64.py +0 -0
  14. {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazydict.py +0 -0
  15. {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazyenv.py +0 -0
  16. {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazyexcel.py +0 -0
  17. {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazyflask.py +0 -0
  18. {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazyid.py +0 -0
  19. {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazyip.py +0 -0
  20. {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazym3u8.py +0 -0
  21. {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazymd5.py +0 -0
  22. {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazypath.py +0 -0
  23. {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazyproxies.py +0 -0
  24. {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazyrandom.py +0 -0
  25. {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazyredis.py +0 -0
  26. {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazyrequests.py +0 -0
  27. {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazytext.py +0 -0
  28. {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazytime.py +0 -0
  29. {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazyua.py +0 -0
  30. {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk/lazywebhook.py +0 -0
  31. {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk.egg-info/SOURCES.txt +0 -0
  32. {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk.egg-info/dependency_links.txt +0 -0
  33. {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk.egg-info/requires.txt +0 -0
  34. {lazysdk-0.1.32 → lazysdk-0.1.34}/lazysdk.egg-info/top_level.txt +0 -0
  35. {lazysdk-0.1.32 → lazysdk-0.1.34}/setup.cfg +0 -0
@@ -1,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lazysdk
3
- Version: 0.1.32
3
+ Version: 0.1.34
4
4
  Summary: 基于Python的懒人包
5
5
  Home-page: https://gitee.com/ZeroSeeker/lazysdk
6
6
  Author: ZeroSeeker
@@ -338,7 +338,7 @@ def save(
338
338
  content,
339
339
  postfix: str = None,
340
340
  path: str = None,
341
- overwrite: str = True,
341
+ overwrite: bool = True,
342
342
  encoding: str = 'utf-8'
343
343
  ):
344
344
  """
@@ -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,6 +1,6 @@
1
1
  Metadata-Version: 2.1
2
2
  Name: lazysdk
3
- Version: 0.1.32
3
+ Version: 0.1.34
4
4
  Summary: 基于Python的懒人包
5
5
  Home-page: https://gitee.com/ZeroSeeker/lazysdk
6
6
  Author: ZeroSeeker
@@ -13,7 +13,7 @@ with open("README.md", "r", encoding='utf-8') as fh:
13
13
 
14
14
  setuptools.setup(
15
15
  name="lazysdk",
16
- version="0.1.32",
16
+ version="0.1.34",
17
17
  description="基于Python的懒人包",
18
18
  long_description=long_description,
19
19
  long_description_content_type="text/markdown",
@@ -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