经验首页 前端设计 程序设计 Java相关 移动开发 数据库/运维 软件/图像 大数据/云计算 其他经验
当前位置:技术经验 » 程序设计 » Python » 查看文章
Python爬虫基础讲解(十七):threading模块的使用
来源:cnblogs  作者:松鼠爱出饼干  时间:2021/6/7 9:17:47  对本文有异议

Python爬虫、数据分析、网站开发等案例教程视频免费在线观看

  1. https://space.bilibili.com/523606542

 

Python学习交流群:1039649593

 

threading模块的使用

python的thread模块是底层的模块,python的threading模块是对thread做了一些包装的,可以更加方便的被使用。

1. threding模块创建线程对象

接上述案例,我们可以利用程序阻塞的时间让程序执行后面的任务,可以用多线程的方式去实现。对应的需要我们借助threading模块去实现:
如下所示

  1. import time
  2. import threading
  3. def work():
  4. """只有函数对象才能佈田名线积"""
  5. print('5.洗茶杯: 1min ' )
  6. time.sleep(1)
  7. print('6.放茶叶: 1min ' )
  8. time.sleep(1)
  9. start_time = time .time()
  10. print( '1.洗壶: 1min ' )
  11. time.s1eep(1)
  12. print( '2.灌凉水:1min ' )
  13. time.sleep(1)
  14. print( '3.烧水: 1min ' )
  15. time.sleep(1)
  16. print( '4.等水烧开:3min ' )
  17. work_thread = threading.Thread(target=work)
  18. # 启动线程对象
  19. work_thread.start()
  20. time.sleep(1) # 5.洗茶杯: 1min
  21. time.sleep(1) # 6.放茶叶: 1min
  22. time.sleep(1)
  23. print( '7.泡茶:1min ' )
  24. time.sleep(1)
  25. print('总共花了: ',time.time() - start_time)

 

以上案例是一个单线程,需要特别注意的是threading模块操作线程所操作的必须是函数对象。通过threding模块可以把一个普通的函数对象转化为线程对象。

2. threding模块创建多线程

当一个进程启动之后,会默认产生一个主线程,因为线程是程序执行流的最小单元,当设置多线程时,主线程会创建多个子线程,在python中,默认情况下,主线程执行完自己的任务以后,就退出了,此时子线程会继续执行自己的任务,直到自己的任务结束。

  1. import time
  2. import threading
  3. def upload():
  4. print("开始上传文件...")
  5. time.sleep(2)
  6. print("完成上传文件...")
  7. def down1oad():
  8. print("开始下载文件...")
  9. time.s1eep(2)
  10. print("完成下载文件...")
  11. if __name__ == '__main__':
  12. upload_thread = threading.Thread(target=up1oad)
  13. up1oad_thread .start()
  14. up1oad_thread.join()
  15. down1oad_thread = threading.Thread(target=down1oaddaemon=True)
  16. down1oad_thread.start()
  17. print('主线程结束')

 

也就是说主线程在分配任务时会创建多个子线程,子线程的任务进度不会阻碍主线程的执行。但是主线程会等待子线程执行任务完之后才结束主线程。也就是说实际上主线程是先执行完任务的,如果你想在主线程执行完之后就结束整个线程的话,那么可以设置守护主线程。

3. 多线程的参数传递

多线程的参数传递用args接受位置参数,用kwargs接受关键字参数。如下所示:

  1. import threading
  2. def get(ur1header=None):
  3. print(ur1)
  4. print(header)
  5. for url in [ 'https : / /www.baidu.com', 'https:/ /www. soso.com ' ,' https: / /www . 360. com']:
  6. # threading.Thread
  7. get_thread = threading. Thread(target=get,args=(ur1, ), kwargs={ ' header ':{ 'user-agent ' : ' pythonrequests'}})
  8. get_thread.start

 

4. 线程产生的资源竞争

首先我们来看一个案例:

  1. import threading
  2. import time
  3. import random
  4. def add1(n):
  5. for i in range(100) :
  6. time.sleep(random.randint(1,3))
  7. with open( 'he7lo.txt', mode='a', encoding='utf-8 ' ) as f:
  8. f.write(f'in} he1lo wor1d !'+ 'he7lo wor1d !'*1024)
  9. f.write(' \n ')
  10. if __name__ == '___main__' :
  11. for n in range(10) :
  12. t1 = threading. Thread(target=add1args=(n,))
  13. t1.start()

 

原文链接:http://www.cnblogs.com/qshhl/p/14844989.html

 友情链接:直通硅谷  点职佳  北美留学生论坛

本站QQ群:前端 618073944 | Java 606181507 | Python 626812652 | C/C++ 612253063 | 微信 634508462 | 苹果 692586424 | C#/.net 182808419 | PHP 305140648 | 运维 608723728

W3xue 的所有内容仅供测试,对任何法律问题及风险不承担任何责任。通过使用本站内容随之而来的风险与本站无关。
关于我们  |  意见建议  |  捐助我们  |  报错有奖  |  广告合作、友情链接(目前9元/月)请联系QQ:27243702 沸活量
皖ICP备17017327号-2 皖公网安备34020702000426号