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 CHANGED
@@ -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
  """
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
- subprocess_limit = os_cpu_count - 1 # 进程数设置为cpu核心数减1
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() # 活跃进程,存放进程,以task_index为key,进程信息为value的dict
54
- task_count = len(task_list) # 总任务数量
57
+ active_process = dict() # 存放活跃进程进程,以task_index为key,进程信息为value的dict
58
+ total_task_num = len(inner_task_list) # 总任务数量
55
59
  task_index_start = 0 # 用来计算启动的累计进程数
56
- q = Queue() # 生成一个队列对象,以实现进程通信
60
+ if return_data:
61
+ q = Queue() # 生成一个队列对象,以实现进程通信
62
+ else:
63
+ pass
57
64
 
58
- showlog.info(f'正在准备多进程执行任务,总任务数为:{task_count},进程数限制为:{subprocess_limit}...')
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, 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
- # 不存在子进程限制规则/当前活跃进程数量未达到进程数限制,将开启一个新进程
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.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
- )
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
- 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 # 记录累计开启进程数
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 False:
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(task_list) and len(active_process.keys()) == 0:
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(url):
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
- 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
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
@@ -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=1Hps7G8q5qHq65v2iQPMo7JGOI-deSN4VbkZPDIaOYw,20805
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=MatyUWr4Vr-egOwG2szLxsV4MdfiqKbWL-du8dA5dKE,5645
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=5sCdVkaQ7_OsQ9AIwjTkBLXQR9SLP27hBCn-J6v04RY,396
23
+ lazysdk/lazyurl.py,sha256=YexBUKue1w7pl22RCcHPZPOfYeE6z4yB69pIenM52Xw,921
24
24
  lazysdk/lazywebhook.py,sha256=HwJIZ5j3wUpnEfPkFY-Xq9T_9xdhCJ71dYsWNX22_3Y,8386
25
- lazysdk-0.1.32.dist-info/METADATA,sha256=vI_Cwtr1ZRYt5Op2d2l6yXU-HG8mn5joNUxCbzrhiPw,1733
26
- lazysdk-0.1.32.dist-info/WHEEL,sha256=2wepM1nk4DS4eFpYrW1TTqPcoGNfHhhO_i5m4cOimbo,92
27
- lazysdk-0.1.32.dist-info/top_level.txt,sha256=--bGS42ZHUhVeO83y1wfvKFg6OjkTLxQ4V4riqPQljY,8
28
- lazysdk-0.1.32.dist-info/RECORD,,
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,,