您的位置:首页 > 编程语言 > Python开发

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。那怎么办呢? 很简单,每个线程在要修改公共数据时,为了避免自己在还没改完的时候别人也来修改此数据,
可以给这个数据加一把锁, 这样其它线程想修改此数据时就必须等待你修改完毕并把锁释放掉后才能再访问此数据。 
未完待续。。。。。。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: