标签:
上节内容,简单的介绍了线程和进程,并且介绍了Python中的GIL机制。本节详细介绍线程、进程以及协程的概念及实现。
方法1: 创建一个threading.Thread对象,在它的初始化函数(__init__)中将可调用对象作为参数传入
import threading import time def worker(): time.sleep(2) print("test") for i in range(5): t = threading.Thread(target=worker) t.start()
方法2:通过继承Thread类,重写run方法
import threading class MyThread(threading.Thread): def __init__(self, func, args): self.func = func self.args = args super(MyThread, self).__init__() def run(self): self.func(self.args) def f2(arg): print(arg) obj = MyThread(f2, 123) obj.start()
上边的2个创建多线程的例子中,多个线程之间没有任何关系。假设这样一种情况,有一个全局的计数num,每个线程获取这个全局的计数,根据num进行一些处理,然后将num加1。很容易写出这样的代码:
import threading import time NUM = 0 class MyThread(threading.Thread): def run(self): global NUM NUM += 1 time.sleep(0.5) msg = self.name+‘ set num to ‘+str(NUM) print(msg) if __name__ == ‘__main__‘: for i in range(5): t = MyThread() t.start() out: Thread-5 set num to 2 Thread-3 set num to 3 Thread-2 set num to 5 Thread-1 set num to 5 Thread-4 set num to 4
问题产生的原因就是没有控制多个线程对同一资源的访问,对数据造成破坏,使得线程运行的结果不可预期。这种现象称为“线程不安全”。因此有了线程锁的概念。
线程同步能够保证多个线程安全访问竞争资源,最简单的同步机制是引入互斥锁。互斥锁为资源引入一个状态:锁定/非锁定。某个线程要更改共享数据时,先将其锁定,此时资源的状态为“锁定”,其他线程不能更改;直到该线程释放资源,将资源的状态变成“非锁定”,其他的线程才能再次锁定该资源。互斥锁保证了每次只有一个线程进行写入操作,从而保证了多线程情况下数据的正确性。
标签:
原文地址:http://www.cnblogs.com/jishuweiwang/p/5686516.html