多任务-Thread

一、理解并行与并发

并行:cpu数多于任务数

例如:

一共有三个任务,分别是:QQ、微信、陌陌;一共有四个CPU,每个任务占据一个CPU。

并发:CPU数少于任务数

例如:

一共有三个任务,但是只有两个CPU,两个CPU去执行三个任务,这样CPU只能是一会儿执行A,一会儿执行B,一会儿在执行C。给每一个任务分配的时间都比较少,但是转换速度比较快,给人的感觉就像是同时执行这几个任务。

二、代码实现简单的并发

import threading
import time def sing():
for i in range(5):
print("*"*100)
print("正在唱歌")
time.sleep(0.5) def dance():
for i in range(5):
print("*"*100)
print("正在跳舞")
time.sleep(0.5) if __name__ == "__main__":
sing()
dance()

代码执行效果如下:

很显然上面的代码并不能达到咱们的目的,它还是sing()函数执行完成之后,采取执行dance()函数的。下面的代码是经过修改的代码,这个代码导入了threading模块并使用,所以可以实现并发的目的。

 1 import threading
2 import time
3
4
5 def sing():
6 for i in range(5):
7 print("*"*100)
8 print("正在唱歌")
9 time.sleep(0.5)
10
11
12 def dance():
13 for i in range(5):
14 print("*"*100)
15 print("正在跳舞")
16 time.sleep(0.5)
17
18
19 if __name__ == "__main__":
20 t1 = threading.Thread(target = sing)
21 t2 = threading.Thread(target = dance)
22 t1.start()
23 t2.start()

代码执行效果如下:

三、查看线程数量

threading.enumerate()  # 获取程序中的所有线程

四、对代码的解释

1.使用threading.Thread()创建一个对象,这个时候并没有从创建一个线程,只有当这个对象调用start()的时候才开始创建一个线程。调用start()函数的时候也是运行线程的时候。

2.几乎同一时间创建许多线程,这些线程并不会同时执行,执行顺序也不确定

五、 补充:

一、 关于enumerate()的那点事:

语法:

enumerate(sequence, [start=0])
'''
sequence------> 一个序列、迭代器或其他支持迭代对象。
start -- 下标起始位置。

'''

1.enumerate()的用法一-------》只使用一个参数

enumerate(可迭代对象)  # 这样的话会返回一个十六进制的内存地址,如下图所示:

list(enumerate(可迭代的对象))  # 会返回一个数组,这个数组既包含元素索引,又包含可迭代对象中的元素

2.enumerate(可迭代的对象, 索引)--------》两个参数

enumerate(可迭代的对象, 索引)-------》返回指定索引处对应值的内存地址

list(enumerate(可迭代的对象, 起始索引))-------》返回从指定索引处开始的索引值以及对应的值

具体效果如下图所示:

3.enumerate配合for循环使用

二、十六进制与二进制之间的转换

可以使用函数hex()。

注意:十六进制的数是以0x开头的

三、如何查看内存地址

可以使用python内置函数id(),会返回一个十进制的内存地址。

02-多任务-thread的更多相关文章

  1. 多线程02.继承Thread类

    package chapter2; /** * 1.使用static虽然完成了当前的功能. * 但是static的生命周期比较长,需要在所有线程执行完成后才会结束. * 还有号没有按照顺序进行打印 * ...

  2. python就业班-淘宝-目录.txt

    卷 TOSHIBA EXT 的文件夹 PATH 列表卷序列号为 AE86-8E8DF:.│ python就业班-淘宝-目录.txt│ ├─01 网络编程│ ├─01-基本概念│ │ 01-网络通信概述 ...

  3. 【实战Java高并发程序设计 2】无锁的对象引用:AtomicReference

    AtomicReference和AtomicInteger非常类似,不同之处就在于AtomicInteger是对整数的封装,而AtomicReference则对应普通的对象引用.也就是它可以保证你在修 ...

  4. 深度解析Java8 – AbstractQueuedSynchronizer的实现分析(上)

    本文首发在infoQ :www.infoq.com/cn/articles/jdk1.8-abstractqueuedsynchronizer 前言: Java中的FutureTask作为可异步执行任 ...

  5. Java多线程系列--“JUC锁”05之 非公平锁

    概要 前面两章分析了"公平锁的获取和释放机制",这一章开始对“非公平锁”的获取锁/释放锁的过程进行分析.内容包括:参考代码获取非公平锁(基于JDK1.7.0_40)释放非公平锁(基 ...

  6. async await的前世今生

    async 和 await 出现在C# 5.0之后,给并行编程带来了不少的方便,特别是当在MVC中的Action也变成async之后,有点开始什么都是async的味道了.但是这也给我们编程埋下了一些隐 ...

  7. Java:ConcurrentHashMap的锁分段技术

    术语定义 术语 英文 解释 哈希算法 hash algorithm 是一种将任意内容的输入转换成相同长度输出的加密方式,其输出被称为哈希值.  哈希表 hash table 根据设定的哈希函数H(ke ...

  8. Java多线程(二)——常用的实现多线程的两种方式

    一.继承Thread类创建线程类 Java使用Thread类代表线程,所有的线程对象都必须是Thread类或其子类的实例.每个线程的作用是完成一定的任务,实际上就是执行一段程序流即一段顺序执行的代码. ...

  9. Java多线程学习(二)---线程创建方式

    线程创建方式 摘要: 1. 通过继承Thread类来创建并启动多线程的方式 2. 通过实现Runnable接口来创建并启动线程的方式 3. 通过实现Callable接口来创建并启动线程的方式 4. 总 ...

随机推荐

  1. 【数据结构】【图文】【oj习题】 图的拓扑排序(邻接表)

    拓扑排序: 按照有向图给出的次序关系,将图中顶点排成一个线性序列,对于有向图中没有限定次序关系的顶点,则可以人为加上任意的次序关系,由此所得顶点的线性序列称之为拓扑有序序列.显然对于有回路的有向图得不 ...

  2. [luogu5180]支配树

    对于有向图$G$和起点$s$,有以下定义和性质-- 为了方便,不妨假设$s$能到达$G$中所有点,并任意建立一棵以$s$为根的dfs树,以下节点比较默认均按照两点在这棵dfs树上的dfs序 支配点:$ ...

  3. poi上传下载

    本教程只实现poi简单的上传下载功能,如需高级操作请绕行! <!--poi start--> <dependency> <groupId>org.apache.po ...

  4. bitset 的妙用:乱搞字符串匹配

    最近碰到了几次 bitset 乱搞字符串匹配的情况,故写文以记之. 1. 算法简介 核心思想:假设文本串为 \(s\),则对字符集中的每一个字符 \(c\) 开一个大小为 \(|s|\) 的 bits ...

  5. 走向深蓝:那些 Linshey 不会的算法

    网络流 树论: Algorithm Round-1 Round-2 Algorithm Round-1 Round-2 点分治 \(\checkmark\) 边分治 \(\checkmark\) 动态 ...

  6. Git五个常见问题及解决方法

    一.删除远程仓库上被忽略的文件 由于种种原因,一些本应该被忽略的文件被我们误操作提交到了远程仓库了.那么我们该怎么删除这些文件呢? 以误提交了.idea目录为例,我们可以通过下面的步骤处理: 1)我们 ...

  7. Mysql笔记(3)

    查询总数count(1)查询总和sum(数据名) 查询最大值max(数据名) 查询最小值min(数据名) 查询平均值avg(数据名) 去除重复 通过having来过滤group by字句的结果信息 i ...

  8. 内网穿透—使用 frp 实现内外网互通

    前言 什么是内网穿透? 内网穿透,又叫 NET 穿透,是计算机用语.用通俗的说法就是你家里的个人电脑,可以直接被外网的人访问.例如你在公司,不通过远程工具,直接也可以访问到家里的电脑(本文章特指 we ...

  9. day05文件编辑命令

    day05文件编辑命令 mv命令:移动文件 mv命令:mv命令用来对文件或目录重新命名,或者将文件从一个目录移到另一个目录中. 格式:mv [原来的文件路径] [现在的文件路径] mv命令后面既可以跟 ...

  10. windows磁盘扩容

    要邻近的磁盘,才可以扩展.所以必须要先删除恢复分区. 删除恢复分区,参考如下: https://jingyan.baidu.com/article/574c5219598d5e6c8c9dc15e.h ...