多任务-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. 痞子衡嵌入式:深扒IAR启动函数流程及其__low_level_init设计对函数重定向的影响

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是IAR启动函数流程及其__low_level_init设计对函数重定向的影响. 上一篇文章 <IAR下RT-Thread工程自定义 ...

  2. 重写(Override)与重载(Overload)区别

    重写是子类对父类的允许访问的方法的实现过程进行重新编写. 方法重写三要素: (1)方法名形参列表相同: (2)返回值类型和声明异常类型子类小于父类: (3)访问权限,子类大于等于父类. 重写的好处在于 ...

  3. BehaviorTree.CPP.行为树XML格式(六)

    The XML format XML模式的基础 在第一个教程中,介绍了这个简单的树. <root main_tree_to_execute = "MainTree" > ...

  4. 浅谈java中的四个核心概念--思途青岛

    Java已经成为一个庞大而复杂的技术平台,对于开发人员而言,要想更好的掌握Java技术,深入理解底层的技术处理细节必不可少. 现在介绍下java的四个核心概念: 1.Java虚拟机 Java虚拟机的主 ...

  5. 27-Roman to Integer-Leetcode

    Given a roman numeral, convert it to an integer. Input is guaranteed to be within the range from 1 t ...

  6. (转载)java中判断字符串是否为数字的方法的几种方法

    java中判断字符串是否为数字的方法: 1.用JAVA自带的函数 public static boolean isNumeric(String str){ for (int i = 0; i < ...

  7. 学习java 7.22

    学习内容: GridBagLayout GridBagLayout布局管理器的功能最强大,但也最复杂,与GridLayout布局管理器不同的是,在GridBagLayout布局管理器中,一个组件可以跨 ...

  8. How To Call An Ambulance

    How to Talk to the Emergency Dispatcher [minutesmatter.upmc稻糠亩] How To Call An Ambulance [askambulan ...

  9. flink-----实时项目---day06-------1. 获取窗口迟到的数据 2.双流join(inner join和left join(有点小问题)) 3 订单Join案例(订单数据接入到kafka,订单数据的join实现,订单数据和迟到数据join的实现)

    1. 获取窗口迟到的数据 主要流程就是给迟到的数据打上标签,然后使用相应窗口流的实例调用sideOutputLateData(lateDataTag),从而获得窗口迟到的数据,进而进行相关的计算,具体 ...

  10. 零基础学习java------33---------http协议,tomcat(其如何在eclipse上发布),注册案例

    一. HTTP协议 https://www.cnblogs.com/vamei/archive/2013/05/11/3069788.html 二. tomcat---------->web服务 ...