当前位置: 首页 > news >正文

龙井网站建设全国建设工程招标信息网站

龙井网站建设,全国建设工程招标信息网站,深圳小程序开发定制公司,关于建设网站的经费请示单线程和多线程进行数据抓取结果还是大有不同的,但是要值得注意的事,如果多线程没调配好可能连单线程的效率都比不上。本次就和大家一起聊一聊单线程多线程的一些需要注意的事项。 知识点 线程(Thread)也叫轻量级进程&#xff0…

单线程和多线程进行数据抓取结果还是大有不同的,但是要值得注意的事,如果多线程没调配好可能连单线程的效率都比不上。本次就和大家一起聊一聊单线程多线程的一些需要注意的事项。

知识点

线程(Thread)也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。线程自己不拥有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属的一个进程的其它线程共享进程所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一进程中的多个线程之间可以并发执行。

多线程语法

在Python中实现多线程编程需要用到的就是threading模块中的Thread类,我们来看看最简单的语法,我们首先来一个简单的函数。

def task(num):count = 0for i in range(num):count += 1print(count)nums = [100, 1000, 10000]
for num in nums:task(num)# 100
#1000
#10000

我们用三个子线程分别计算。

import threadingdef task(num):count = 0for i in range(num):count += 1print(count)nums = [100, 1000, 10000]
for num in nums:t = threading.Thread(target=task, args=(num,))t.start()

利用Thread创建线程,target参数接收函数名,args参数接收函数的参数,start方法启动线程。

这里还需要讲解一下join方法,他的作用是让主线程等待,直到该子线程结束。我们来看看加该方法和不加该方法,最终的结果是怎么样的。

import threadingdef task():num = 0for i in range(10000000):num += 1print(num)t = threading.Thread(target=task)
t.start()
print('end')# end
# 10000000
import threadingdef task():num = 0for i in range(10000000):num += 1print(num)t = threading.Thread(target=task)
t.start()
t.join()
print('end')# 10000000
# end

GIL

在说概念之前,我们还是以上面的代码为例,分别求单线程和多线程代码运行的时间。

单线程

import timedef task(num):count = 0for i in range(num):count += 1print(count)nums = [1000000, 100000000, 1000000000]
start = time.time()
for num in nums:task(num)
end = time.time()
print(end - start)# 50.44705629348755

多线程

import threading
import timedef task(num):count = 0for i in range(num):count += 1print(count)nums = [1000000, 100000000, 1000000000]
ts = []
start = time.time()for num in nums:t = threading.Thread(target=task, args=(num,))t.start()ts.append(t)for t in ts:t.join()end = time.time()
print(end - start)# 55.022353172302246

你会发现多线程比单线程花费的时间还要更多,这是因为GIL的原因。

GIL的全称是Global Interpreter Lock(全局解释器锁),Python最初的设计理念在于,为了解决多线程之间数据完整性和状态同步的问题,设计为在任意时刻只能由一个线程在解释器中运行。因此Python中的多线程是表面上的多线程(同一时刻只有一个线程),不是真正的多线程。

但是如果是因为GIL的原因,就说多线程无用是不对的,对于IO密集的程序,多线程是要比单线程快的。我们举一个简单的爬虫案例。

单线程

import timedef task(url):s = url.split('_')[-1]time.sleep(int(s)) #这里模拟请求等待urls = ['url_1', 'url_2', 'url_3']
start = time.time()
for url in urls:task(url)
end = time.time()
print(end - start)# 6.013520002365112

多线程

import threading
import timedef task(url):s = url.split('_')[-1]time.sleep(int(s))ts = []
urls = ['url_1', 'url_2', 'url_3']
start = time.time()for url in urls:t = threading.Thread(target=task, args=(url,))t.start()ts.append(t)for t in ts:t.join()end = time.time()
print(end - start)# 3.005527973175049

这时候我们就能看到多线程的优势了,虽然多线程只是在各线程来回切换,但是可以让IO堵塞的时间切换到其他线程做其他的任务,很适合爬虫或者文件的操作。

http://www.laogonggong.com/news/70901.html

相关文章:

  • 阳泉做网站多少钱莱芜雪野湖别墅
  • 重庆网站建设重庆零臻科技行个人网站主题
  • 济南 手机网站制作wordpress插件打不开
  • 住房建设部官方网站设计费计取wordpress+外网无法访问
  • 宁波网站制作定制网页美术设计主要学什么
  • 江苏建设工程招投标网站云服务器如何搭建网站
  • 成都网站排名优化报价厦门seo外包平台
  • 公众号如何做网站wordpress 标签小工具
  • 机械厂做的网站模板叫什么梅州网站优化
  • 胶州网站建设效果广州海珠区房价2023年最新房价
  • 自己做本地网站域名备案号查询
  • 陇南市建设局网站公示济宁住房与建设网站
  • 合江做网站智慧团建注册登录入口电脑版
  • 使用网站的mysqlwordpress4.9.8 特别慢
  • 大型网站为什么难做编辑wordpress模板下载
  • 招远水利建设工程公司网站卢沟桥网站建设
  • 个人网站需要什么页面校园网站建设的开题报告
  • h5响应式集团网站推荐网站 模板 下载
  • 网站的建设目标是什么代理网络是什么
  • 网站建设要咨询哪些wordpress+展开
  • 上海 宝安网站建设 网络服务北京西站官网主页
  • python和php做网站太原今天刚刚发生的新闻
  • 徐州市建设工程信息服务平台太原搜索引擎优化
  • CDN 网站是否需要重新备案网站图片管理系统
  • 用固定ip做访问网站服务器房天下官网首页
  • 建设项目环境影响登记网站天津常州seo网络推广
  • 怎么做百度网站推广北京市建设工程交易信息网官网
  • 北京网站备案号邢台网站建设邢台
  • 企业网站源码搜一品资源简单网站建设软件
  • 网站静态化设计驻马店哪里做网站