1.线程是程序里面最小的执行单元。

2.进程是资源的集合。

  线程是包含在进程里面的,一个进程可以有多个线程,但只要要有一个线程。

一.多线程,就是N个线程一起干活:

  1.传统方式,串行,循环5次需要15s:

import threading,time

def run():
  time.sleep(3) #干活需要3s
print('哈哈哈') for i in range(5): #串行
run()

  2.使用多线程并发的方式,节省时间:

import threading,time

def run():
  time.sleep(3) #干活需要3s
print('哈哈哈')
for i in range(5):#并发
  t = threading.Thread(target=run) #实例化了一个线程,其中target=执行的函数名
  t.start() #启动线程

举例:多线程爬虫,比较下并发和串行的时间:

 串行方式:

import threading,time,requests

urls = {
'baidu':'http://www.baidu.com',
'hao123':'http://www.hao123.com',
'taobao':'https://www.taobao.com/'
} def down_html(file_name,url):
res = requests.get(url).content #返回二进制内容
open(file_name+'.html','wb').write(res) #因此打开的时候,用wb二进制打开 用串行方式
start_time = time.time()
for k,v in urls.items():
down_html(k,v)
end_time = time.time() run_time = end_time - start_time
print('下载总共花了%s的时间'%run_time)

串行结果:

并行方式:这种方式计算的并发时间是不准确的,因为在运行程序时默认先运行主线程,其他线程只是开始运行(下载网页)并不一定结束(而一个进程中的多个线程都是相互独立的。)主线程负责定义函数,启动其他线程等。因此,最终并行运行的结果时间,仅仅是主线程的运行时间。

   主线程
默认有个主线程
子线程:
主线程启动子线程
import threading,time,requests

urls = {
'baidu':'http://www.baidu.com',
'hao123':'http://www.hao123.com',
'taobao':'https://www.taobao.com/'
} def down_html(file_name,url):
res = requests.get(url).content #返回二进制内容
open(file_name+'.html','wb').write(res) #因此打开的时候,用wb二进制打开 #用并行方式
start_time = time.time()
for k,v in urls.items():#因为urls里有3个Key,因此会启动3个线程
t = threading.Thread(target=down_html,args=(k,v)) #使用多线程调用参数时,必须用args=xx才能传参
t.start()
end_time = time.time()
run_time = end_time - start_time
print('下载共花了%s时间'%run_time)

并行结果:

线程等待:.join()-----实现并发

下面程序运行流程:

主线程负责启动5个子线程,把每个线程放在threads list里,然后等待所有线程等待完毕后,再执行end_time = time.time()语句,实现最后计算所有线程都结束的并发时间。

主线程
默认有个主线程
子线程:
主线程启动子线程
import threading,time
def run():
time.sleep(3):
print('哈哈哈哈') start_time = time.time()
threads=[] #存放启动的5个子线程
for i in range(5):
t = threading.Thread(target=run) #实例化
t.start() #启动线程
threads.append(t) #启动后将子线程加入列表 for t in threads: #主线程循环等待5个子线程执行结束
t.join() #循环等待,等所有线程执行完毕后,再执行下一句,即实现计算所有并发时间
end_time = time.time()
print('run_time',end_time-start_time)

运行结果:并发时间:(这个时间是准确的)

多线程threading初识,线程等待的更多相关文章

  1. c/c++ 多线程 多个线程等待同一个线程的一次性事件

    多线程 多个线程等待一个线程的一次性事件 背景:从多个线程访问同一个std::future,也就是多个线程都在等待同一个线程的结果,这时怎么处理. 办法:由于std::future只能被调用一次get ...

  2. 多线程threading初识二--多线程等待

    .join() :子线程等待主线程 下面程序运行流程: 主线程负责启动5个子线程,把每个线程放在threads list里,然后等待所有线程等待完毕后,再执行end_time = time.time( ...

  3. python中多进程multiprocessing、多线程threading、线程池threadpool

    浅显点理解:进程就是一个程序,里面的线程就是用来干活的,,,进程大,线程小 一.多线程threading 简单的单线程和多线程运行:一个参数时,后面要加逗号 步骤:for循环,相当于多个线程——t=t ...

  4. Java多线程5:线程等待与唤醒

    原文:http://www.cnblogs.com/skywang12345/p/3479224.html wait(),notify(), notifyAll()等方法介绍在Object.java中 ...

  5. 12、多线程:Threading、守护线程

    线程与进程: 线程对于进程来说,就好似工厂里的工人,分配资源是分配到工厂,工人再去处理. 线程是被系统独立调度和分派的基本单位,线程自己不拥有系统资源,只拥有一点儿在运行中必不可少的资源,但它可与同属 ...

  6. 多进程 multiprocessing 多线程Threading 线程池和进程池concurrent.futures

    multiprocessing.procsess 定义一个函数 def func():pass 在if __name__=="__main__":中实例化 p = process( ...

  7. Java多线程系列--“基础篇”05之 线程等待与唤醒

    概要 本章,会对线程等待/唤醒方法进行介绍.涉及到的内容包括:1. wait(), notify(), notifyAll()等方法介绍2. wait()和notify()3. wait(long t ...

  8. java 多线程—— 线程等待与唤醒

    java 多线程 目录: Java 多线程——基础知识 Java 多线程 —— synchronized关键字 java 多线程——一个定时调度的例子 java 多线程——quartz 定时调度的例子 ...

  9. c/c++ 多线程 一个线程等待某种事件发生

    多线程 一个线程等待某种事件发生 背景:某个线程在能够完成其任务之前可能需要等待另一个线程完成其任务. 例如:坐夜间列车,为了能够不坐过站, 1,整夜保持清醒,但是这样你就会非常累,不能够睡觉. 2, ...

随机推荐

  1. 利用中转输出表制作HijackDll

    [原创]利用中转输出表制作HijackDll(附工具源码)作 者: baixinye时 间: 2012-08-05,16:48:45链 接: http://bbs.pediy.com/showthre ...

  2. k3 cloud凭证过账的时候提示凭证号不连续

    解决办法:进入凭证查询页面,点击凭证业务操作下面的凭证整理 提交整理完成即可

  3. iOS 设备尺寸以及图标尺寸

    iPhone 4和iPod Touch 4有一个新的特性:在屏幕尺寸不变的前提下,分辨率提升一倍(320 x 480 => 640 x 960).苹果将这个特性命名为Retina. 用苹果的话讲 ...

  4. Linux系统性能测试工具(七)——网络性能工具之iperf

    本文介绍关于Linux系统(适用于centos/ubuntu等)的网络性能测试工具-iperf.磁盘io性能测试工具包括: iperf: netperf 参考链接:https://www.cnblog ...

  5. 16.Linux-CentOS系统进入单用户模式修改root用户密码操作

    问题描述: root用户密码忘记,进入单用户重置root用户密码 解决步骤: 1.重启服务器,在系统显示内核版本界面后“按E键”,进入内核启动项2.找到Linux16这一行段,将“ro”修改成“rw” ...

  6. PHP常用采集函数总结

    1.获取所有链接内容和地址 function getAllURL($code){ preg_match_all('/<as+href=["|']?([^>"']+)[& ...

  7. LOJ#3097 [SNOI2019]通信 最小费用最大流+cdq分治/主席树/分块优化建图

    瞎扯 我们网络流模拟赛(其实是数据结构模拟赛)的T2. 考场上写主席树写自闭了,直接交了\(80pts\)的暴力,考完出来突然发现: woc这个题一个cdq几行就搞定了! 题意简述 有\(n\)个哨站 ...

  8. 文本检错——中文拼写检查工具FASPell

    最近因为相关项目需要考虑中文文本检错,然后就发现了爱奇艺发布的号称SOTA的FASPell已经开源代码,所以开始着手实现. 检错思想两步:一,掩码语言模型(MLM)产生候选字符:二,CSD过滤候选字符 ...

  9. [每日一讲] Python系列:字符串(上)

    字符串作为人类最常处理的内容,在计算中决定了其占有重要的地位.在 Python 中,字符串的操作和处理往往需要根据实际问题,结合其他操作才可以完成目标.在复杂世界仅仅是字符串 API 还无法完成工作. ...

  10. 【leetcode】1156. Swap For Longest Repeated Character Substring

    题目如下: Given a string text, we are allowed to swap two of the characters in the string. Find the leng ...