爬虫学习笔记-多线程(1)

我怕爱的太早我们不能终老 提交于 2020-03-09 13:40:48

一个线程只属于一个进程
一个进程可以有多个线程

在进程内部,如果要干多个事情,就需要运行多个子任务,这些子任务叫线程,线程共享所属进程地内存空间

模块:
1,_thrad模块 低级模块
2,threading模块 高级模块,对低级模块进行封装

普通实例

import threading,time
def run(num):
    print('子线程(%s)开始'%(threading.current_thread().name))
    time.sleep(2)
    print('打印',num)
    time.sleep(2)
    print('子线程(%s)结束'%(threading.current_thread().name))

if __name__=='__main__':
   print('主线程(%s)开始'%(threading.current_thread().name))
   t=threading.Thread(target=run,name='runthread',args=(1,))
   #target为这个主线程要执行地函数名字
   #args为要传入的函数参数
   #用t这个变量接收线程
   t.start()#运行线程
   t.join()#等待线程结束
   print('主线程(%s)结束'%(threading.current_thread().name))
   #主线程结束

实例2:如果两个案例同时对数据修改,会使得数据混乱

num=0
def run(n):
    global num #把num声明成全局变量
    for i in range(1000000):
    num=num+n   #对参数修改
    num=num_n

if __name__=='__main__':
#定义一个主入口:赋值,判断是否修改
    t1=threading.Thread(target=run,args=(6,))
    t2=threading.Thread(target=run,args=(9,))
    #创建两个线程
    t1.start()
    t2.start()
    t1.join()
    t2.join()
    print(num)
# 解决方法,加锁
lock=threading.Lock()#定义一个锁
num=0
def run(n):
    global num #把num声明成全局变量
    for i in range(1000000):
    with lock:      #自动上锁,解锁
        num=num+n   #对参数修改
        num=num_n
    

if __name__=='__main__':
#定义一个主入口:赋值,判断是否修改
    t1=threading.Thread(target=run,args=(6,))
    t2=threading.Thread(target=run,args=(9,))
    #创建两个线程
    t1.start()
    t2.start()
    t1.join()
    t2.join()
    print(num)   

案例四:一起过马路

bar=threading.Barrier(3)
#够三个人才走
def run():
   print('%s--start'%(threading.current_thread().name))
   time.sleep(1)
   bar.wait()#这就是在等人
   print('%s--end'%(threading.current_thread().name))

if __name__=='__main__':
    for i in range(5):
       threading.Thread(target=run).start()

定时线程

def run():
    print('********')


t=thread.Timer(5,run)
t.start()
t.join()
print('end')
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!