关于多任务的理解,

代码要执行,首先得变成机器认识的东西执行,那么需要解释器。那么执行按道理,一段程序在这里就具体来说一段代码的执行吧,我们知道代码的执行是从上至下按顺序执行,那么这里有条件分支结构,循环结构,这里不再说这些结构。当你想让两个任务同时执行即两个函数同时执行,那么就必须用到多线程的技术,否则只会按照函数调用的顺序从上至下按顺序执行,一个函数执行完了,才会跑下一个函数。所以采用多线程技术。以下为一个多线程的代码例子,步骤为导入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。

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

最新文章

  1. 第2章 Linux系统安装(2)_Linux系统分区及文件系统
  2. final发布评价
  3. uva 10801 - Lift Hopping(最短路Dijkstra)
  4. 洛谷P1136 迎接仪式
  5. Windows下移动硬盘无法识别但是Mac下可以识别
  6. Light OJ 1314 Names for Babies
  7. python3 随机数
  8. 前端面试:谈谈 JS 垃圾回收机制
  9. 服务管理之httpd
  10. wordpress站内搜索结果页URL伪静态如何操作
  11. caffe的model参数解析numpy多维数组的存取
  12. idea 连接数据库
  13. 20145318《网络对抗》Web应用
  14. PHP写的手机端网站,可以打包成app吗,怎么打包?
  15. BASIC-21_蓝桥杯_Sine之舞
  16. 2017 ACM-ICPC 亚洲区(南宁赛区)网络赛:Frequent Subsets Problem (状态压缩)
  17. java 验证码生成
  18. circso 对数据进行可视化
  19. osgEarth中的StringUtils头文件中有很多关于字符串的操作
  20. python之守护进程

热门文章

  1. JAVA同步锁机制 wait() notify() notifyAll()
  2. 使用Maps与Sets处理集合的交差运算
  3. 小白的REDIS学习(二)-链表
  4. LIMIT用法
  5. 根据图片URL获取图片的尺寸【Swift语言实现】
  6. python基础13_zip_import
  7. json_encode 的局限 , 使用自定义的函数 .returnJson.
  8. 【原创】Aduino小车玩法全记录
  9. 单链表sLinkList类,模板类
  10. JS快排