码迷,mamicode.com
首页 > 编程语言 > 详细

python之多线程

时间:2018-09-07 22:04:35      阅读:186      评论:0      收藏:0      [点我收藏+]

标签:tick   font   进程   +=   style   release   形式   color   共享   

多线程是为了同步完成多项任务,通过提高资源效率来提高系统的效率。它是在同一时间完成多项任务的时候实现的。在 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之多线程

标签:tick   font   进程   +=   style   release   形式   color   共享   

原文地址:https://www.cnblogs.com/aisiyuan/p/9607244.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!