'''多进程多线程进行学习使用2'''
import math
import datetime
from concurrent.futures import ThreadPoolExecutor,ProcessPoolExecutor
def print_value(page_list):
for i in page_list:
print(i+1,'+',int(str(datetime.datetime.now()).split('.')[-1]))
def my_thread(page_num):
page_num=167
page_list=[x for x in range(page_num)]#[0, 1, 2, 3, 4,,,,,166]
#设置线程数量,10个线程,每个线程处理16个任务
thread_num=10
#将总页数平均分配
tesk_num=math.ceil(page_num/thread_num) #int(len(page_list)/thread_num) 167//10=16 16个任务
#设置 线程 对象
thread=ThreadPoolExecutor(max_workers=thread_num)#thread_num=10 线程数量
for index in range(thread_num+1):#分为10+1个进程0-10
# 计算每个线程应执行的任务量
start_num=tesk_num*index #起始数字16*0=0-15开始,下一个线程是从16*1=16-31开始
if tesk_num*(index+1)<=page_num: #16*(9+1)<=167
end_num=tesk_num*(index+1) #结束数字16*(0+1)=16.-------------则任务range(0,16)--0-15
else:#start_num=16*(10)=160 #16*11=160+16=176>167时
end_num=page_num #end_num=167
#每个线程各自执行不同的列表页数
thread.submit(print_value,page_list[start_num:end_num])
def my_process():#max_workers=2 根据每个CPU创建一个进程
with ProcessPoolExecutor(max_workers=2) as executor:
for i in range(65,68):#26个 进程 #print(chr(i)) #将数字转换为字母65-91--A-Z,48-58--0-9
executor.submit(my_thread, chr(i))
if __name__=='__main__':
'''
多进程和多线程注意:
实现分布式爬虫的时候,必须注意:1、全局变量不能放在if __name__=='__main__':中,因为使用多进程的是时候新开的线程不会在此获取数据。
2、使用数据库最好重新创建一个数据库,如果多个线程和进程共同使用一个连接会出现异常。
3、分布式策略最好在程序代码的最外层实现,在代码底层实现分布式不是不可行,只是代码变动太大,而且考虑的因素太多,代码维护相对较难
'''
my_process()