python自动化之路-day8
2016-11-29 16:13
369 查看
线程,进程,协程等python thread模块线程有两种调用方式:直接调用:
import threading import time def sayhi(num): print("threading - > %s"%num ) time.sleep(2) if __name__ == '__main__': t1 = threading.Thread(target=sayhi,args=(1,)) t2 = threading.Thread(target=sayhi,args=(2,)) t1.start() #启动线程 t2.start() #启动另一个线程 print(t1.getName()) print(t2.getName())
继承式调用:
import threading import os import time class MyThread(threading.Thread): def __init__(self,num): threading.Thread.__init__(self) self.num = num def run(self): print("running on number : %s"%self.num) if __name__ == '__main__': t1 = MyThread(1) t2 = MyThread(2) t1.start() t2.start()
互斥锁
""" 一个进程下可以启动多个线程,多个线程共享父进程的内存空间,这也意味着 每个线程可以访问同一份数据,此时,如果2个线程同时要修改同一份数据, 会出现什么情况 """ import time import threading def AddNum(): global num #在每个线程中都获取这个全局变量 print("--get num:",num) time.sleep(2) num += 1 #对此公共变量进行+1操作 num = 10 #设置一个共享变量 threading_list = [] for i in range(10): t = threading.Thread(target=AddNum) t.start() # print(t) threading_list.append(t) for t in threading_list: print(t) t.join() print("final num:",num)
正常来讲,这个num结果应该是0, 但在python 2.7上多运行几次,会发现,最后打印出来的num结果不总是0,
为什么每次运行的结果不一样呢? 哈,很简单,假设你有A,B两个线程,此时都 要对num 进行减1操作,
由于2个线程是并发同时运行的,所以2个线程很有可能同时拿走了num=100这个初始变量交给cpu去运算,
当A线程去处完的结果是99,但此时B线程运算完的结果也是99,两个线程同时CPU运算的结果再赋值给num变量后,
结果就都是99。那怎么办呢? 很简单,每个线程在要修改公共数据时,为了避免自己在还没改完的时候别人也来修改此数据,
可以给这个数据加一把锁, 这样其它线程想修改此数据时就必须等待你修改完毕并把锁释放掉后才能再访问此数据。
未完待续。。。。。。
相关文章推荐
- python 自动化之路 day 00 目录
- python 自动化之路 day 面向对象基础
- python 自动化之路 logging日志模块
- python自动化之路-day6
- python 自动化之路 day 08_2 网络编程
- python之路-DAY8
- python 自动化之路 day 09 进程、线程、协程篇
- python自动化之路-day4.1
- python 自动化之路 day 05
- python 自动化之路 分分钟带你写个FTP
- Python之路,Day8 - Socket网络编程
- python自动化之路-day2
- python 自动化之路 day 01.1 数据类型
- python自动化之路-day5
- python 自动化之路 day 04.1 python内置函数
- python 自动化之路 day 01 人生若只如初见
- python 自动化之路 day 02
- python自动化之路-day3
- python自动化之路-day5.1
- python自动化之路-day8.1