关于多任务的理解,

代码要执行,首先得变成机器认识的东西执行,那么需要解释器。那么执行按道理,一段程序在这里就具体来说一段代码的执行吧,我们知道代码的执行是从上至下按顺序执行,那么这里有条件分支结构,循环结构,这里不再说这些结构。当你想让两个任务同时执行即两个函数同时执行,那么就必须用到多线程的技术,否则只会按照函数调用的顺序从上至下按顺序执行,一个函数执行完了,才会跑下一个函数。所以采用多线程技术。以下为一个多线程的代码例子,步骤为导入threading模块,线程与函数绑定,启动线程。这样就完成了同时唱歌跳舞。线程的执行是无序的,就可以看到打印出的结果是无序的唱歌跳舞。

 import threading

 import time

 def dance():
while True:
print("跳舞")
time.sleep(1) def sing(name,age):
while True:
print("唱歌",age,name)
time.sleep(1)
def main():
threading.Thread(target=dance).start()
threading.Thread(target=sing,kwargs={"name":"卡卡西","age":1000}).start() if __name__ == '__main__':
main()

什么是线程:线程是cpu执行的单位。为了多任务处理而存在,执行顺序无序,互相共享全局变量,主线程要等子线程跑完才会结束(如果设置了守护线程,那么当主线程的代码跑完了,守护线程就会陪葬。当主线程里有两个子线程,一个子线程是守护线程一个不是,此时主线程代码跑完,子线程代码如果没跑完,结果就是仍然要把两个子线程都跑完)

此外,值得一提的是,线程之间的共享全局变量是不安全的,举个栗子。一个线程要开始存钱的任务,一个线程要开始取钱的任务,那么此时如果按照这种机制来说,就会出现问题,可能系统最后不知道你实际到底还有多少钱了。问题出现的根本原因就在于计算机底层的工作原理,在这里就不多说了,简单来说分三步,CPU从内存拿数据,处理完,交还给内存。在这三步的过程中,另一个线程也来的话,显而易见的会出现混乱。

所以,出现了互斥锁,当线程A在处理的时候不让别人掺和进来,问题不久解决了,当然还有一个方法就是等待哟个线程跑完后在进行下一个线程,那这就违背了多线程的初心。所以怎么加锁?见一下代码

 import threading
lock = threading.Lock()
num1 = 0
def write1():
global num1
for temp in range(1000000):
lock.acquire()
num1 += 1
lock.release()
print("write1结束")
print(num1) def write2():
global num1
for temp in range(1000000):
lock.acquire()
num1 += 1
lock.release()
print("write2结束")
print(num1) def main():
threading.Thread(target=write1).start()
threading.Thread(target=write2).start() if __name__ == '__main__':
main()

显而易见,这里分三步,首先创建一把锁,然后上锁,最后释放锁。当然释放锁是必然的如果不释放就会造成死锁。这显然是一个BUG。

至此,简单总结完了线程,未尽事宜,请多指点。

PYTHON之路,线程的更多相关文章

  1. python之路----线程

    线程概念的引入背景 进程 程序并不能单独运行,只有将程序装载到内存中,系统为它分配资源才能运行,而这种执行的程序就称之为进程.程序和进程的区别就在于:程序是指令的集合,它是进程运行的静态描述文本:进程 ...

  2. Python之路——线程池

    1 线程基础 1.1 线程状态 线程有5种状态,状态转换的过程如下图所示: 1.2 线程同步——锁 多线程的优势在于可以同时运行多个任务(至少感觉起来是这样,其实Python中是伪多线程).但是当线程 ...

  3. python之路 线程、进程、协程、队列、python-memcache、python-redis

    一.线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. #!/usr/bin/env python # -*- coding:utf-8 -*- import threa ...

  4. python之路--线程的其他方法

    一 . current_thread的用法 import threading import time from threading import Thread, current_thread def ...

  5. Python之路【第七篇】:线程、进程和协程

    Python之路[第七篇]:线程.进程和协程   Python线程 Threading用于提供线程相关的操作,线程是应用程序中工作的最小单元. 1 2 3 4 5 6 7 8 9 10 11 12 1 ...

  6. Python之路(第四十六篇)多种方法实现python线程池(threadpool模块\multiprocessing.dummy模块\concurrent.futures模块)

    一.线程池 很久(python2.6)之前python没有官方的线程池模块,只有第三方的threadpool模块, 之后再python2.6加入了multiprocessing.dummy 作为可以使 ...

  7. Python之路,Day9, 进程、线程、协程篇

    本节内容 操作系统发展史介绍 进程.与线程区别 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者 ...

  8. Python之路,进程、线程、协程篇

      本节内容 进程.与线程区别 cpu运行原理 python GIL全局解释器锁 线程 语法 join 线程锁之Lock\Rlock\信号量 将线程变为守护进程 Event事件 queue队列 生产者 ...

  9. python之路 目录

    目录 python python_基础总结1 python由来 字符编码 注释 pyc文件 python变量 导入模块 获取用户输入 流程控制if while python 基础2 编码转换 pych ...

  10. Python之路【第六篇】:socket

    Python之路[第六篇]:socket   Socket socket通常也称作"套接字",用于描述IP地址和端口,是一个通信链的句柄,应用程序通常通过"套接字&quo ...

随机推荐

  1. JavaScript常用数组操作方法,包含ES6方法

    一.concat() concat() 方法用于连接两个或多个数组.该方法不会改变现有的数组,仅会返回被连接数组的一个副本. var arr1 = [1,2,3]; var arr2 = [4,5]; ...

  2. Delphi做验证码登录窗口

    在五月麦田的帮助下做成了,感觉挺好,验证码输入的时候需要大写: 组件:LabelEdit 3个  Button 2个  image 1个. 代码如下: unit Unit1; interface us ...

  3. NPOI处理Word文本中上下角标

    读取Word文档,并将文本转成html标签,后面发现,经常有带上下角标的内容,于是一并处理了. 核心在于对XWPFRun对象中Subscript属性的处理. /// <summary> / ...

  4. HTTP请求协议

    请求(Request)协议 * GET请求方式 * 请求行 * http协议的版本信息 1.1 * 请求地址 - URL?key=value&key=value * 请求方式 - GET * ...

  5. 移动端设备中1px适配

    方式1:伪类+transform实现,主要用transform中的scale缩放,缩放默认中心点是以x,y轴的50%处,因此需要用transform-origin调整中心点 html代码: <d ...

  6. zsh 缺省输入设置

    zsh 默认缺省方式和bash不兼容,终端输入指令带有* 并不能对所有以已经输入的部分作为开头的文件作处理,解决这个问题的方式是在.zshrc文件中加入 setopt no_match 即可

  7. redis初始化服务器

    从启动 Redis 服务器, 到服务器可以接受外来客户端的网络连接这段时间, Redis 需要执行一系列初始化操作. 整个初始化过程可以分为以下六个步骤: 初始化服务器全局状态. 载入配置文件. 创建 ...

  8. 微信小程序页面列表与详情页跳转的正确姿势

    初学小程序,碰到列表与详情页跳转遇到的问题,记录一下. 一.问题 1个列表页: 1个详情页: 列表页代码: onLoad:异步查询数据并setData 详情页代码: 保存成功后,调用navigateB ...

  9. 递归加载Treeview

    using System;using System.Collections.Generic;using System.ComponentModel;using System.Data;using Sy ...

  10. Java的类型强制转换

    不说基本类型,没什么意思. 小括号的类型转换,在引用上,表示我坚定的确信,该未知类型一定是我转的类型,或者是我转的类型的子类. 这个转换逻辑和基本类型是不一致的.它不会进行任何具体的操作,只是一种标识 ...