多进程多线程进行学习使用2

'''多进程多线程进行学习使用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()
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

潇洒郎

您打赏我发自肺腑努力创作的心灵

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值