python之多线程
Posted aisiyuan
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了python之多线程相关的知识,希望对你有一定的参考价值。
多线程是为了同步完成多项任务,通过提高资源效率来提高系统的效率。它是在同一时间完成多项任务的时候实现的。在 Python 中,使用多线程的模块是 threading。其中最常用的是 Thread 类。
import threading import time def coding(): for x in range(3): print(‘%s正在写代码‘ % x) time.sleep(1) def drawing(): for x in range(3): print(‘%s正在画图‘ % x) time.sleep(1) def single_thread(): coding() drawing() def multi_thread(): t1 = threading.Thread(target=coding) t2 = threading.Thread(target=drawing) t1.start() t2.start() if __name__ == ‘__main__‘: multi_thread()
可以使用 threading.enumerate() 函数来看到当前线程的数量。
另外, 也可以使用类的形式来封装一个线程,这样,代码具有更好的扩展性。它是继承 Threading 类。并且重写 run 方法。
import threading import time class CodingThread(threading.Thread): def run(self): for x in range(3): print(‘%s正在写代码‘ % threading.current_thread()) time.sleep(1) class DrawingThread(threading.Thread): def run(self): for x in range(3): print(‘%s正在画图‘ % threading.current_thread()) time.sleep(1) def multi_thread(): t1 = CodingThread() t2 = DrawingThread() t1.start() t2.start() if __name__ == ‘__main__‘: multi_thread()
多线程全局变量共享的安全问题
因为多线程是在同一个进程中运行的。在进程中的全局变量是可以共享的,这就造成了一个问题,因为线程执行的顺序是无序的。有可能会造成数据错误。比如以下代码:
import threading tickets = 0 def get_ticket(): global tickets for x in range(1000000): tickets += 1 print(‘tickets:%d‘%tickets) def main(): for x in range(2): t = threading.Thread(target=get_ticket) t.start() if __name__ == ‘__main__‘: main()
为了解决以上问题,Python 解释器中引入了锁机制。当我一个线程使用这个变量的时候,就给它上了一个锁,别的线程此刻无法访问这个变量,直到我这个线程使用完后,然后释放掉锁。就像我去厕所,关上了门,别人就无法进来使用,直到我打开门后,别人在能上厕所。锁的引入是为了解决全局变量的安全问题。
1 import threading 2 3 VALUE = 0 4 5 gLock = threading.Lock() 6 7 def add_value(): 8 global VALUE 9 gLock.acquire() 10 for x in range(1000000): 11 VALUE += 1 12 gLock.release() 13 print(‘value:%d‘%VALUE) 14 15 def main(): 16 for x in range(2): 17 t = threading.Thread(target=add_value) 18 t.start() 19 20 if __name__ == ‘__main__‘: 21 main()
以上是关于python之多线程的主要内容,如果未能解决你的问题,请参考以下文章