python basics === multithreading

threading module

Code first:

 1 import time, threading
 2 
 3 def loop():
 4     print("thread %s is running..." %threading.current_thread().name)
 5     n = 0
 6     while n<5:
 7         n += 1
 8         print('thread %s >>> %s'%(threading.current_thread().name, n))
 9         time.sleep(1)
10     print("thread %s ended." %threading.current_thread().name)
11 
12 def loop1():
13     x = 1
14     while x <3:
15         print(x,"loop1的线程")
16         x += 1
17         time.sleep(2)
18 
19 if __name__ == "__main__":
20     print("thread %s is running ..." %threading.current_thread().name)
21     t = threading.Thread(target = loop, name = "LoopThread")
22     t1 = threading.Thread(target = loop1)
23     t.start()
24     t1.start()
25     t.join()
26     t1.join()
27     print("thread %s ended." % threading.current_thread().name)
28     
29 
30 """
31 thread MainThread is running ...
32 thread LoopThread is running...1
33 thread LoopThread >>> 1
34 loop1的线程
35 thread LoopThread >>> 2
36 2thread LoopThread >>> 3 
37 loop1的线程
38 thread LoopThread >>> 4
39 thread LoopThread >>> 5
40 thread LoopThread ended.
41 thread MainThread ended.
42  
43 """
View Code

 

由于任何进程默认就会启动一个线程,我们把该线程称为主线程,主线程又可以启动新的线程,Python的threading模块有个threading.current_thread() 获取当前线程的实例。

 

但是有些情况下,多线程会产生场景上的错误,比如

import time, threading

# 假定这是你的银行存款:
balance = 0

def change_it(n):
    # 先存后取,结果应该为0:
    global balance
    balance = balance + n
    balance = balance - n

def run_thread(n):
    for i in range(100000):
        change_it(n)

t1 = threading.Thread(target=run_thread, args=(5,))
t2 = threading.Thread(target=run_thread, args=(8,))
t1.start()
t2.start()
t1.join()
t2.join()
print(balance)

结果有时会报错

如果我们要确保balance计算正确,就要给change_it()上一把锁,当某个线程开始执行change_it()时,我们说,该线程因为获得了锁,因此其他线程不能同时执行change_it(),只能等待,直到锁被释放后,获得该锁以后才能改。由于锁只有一个,无论多少线程,同一时刻最多只有一个线程持有该锁,所以,不会造成修改的冲突。创建一个锁就是通过threading.Lock()来实现:

import time, threading
lock = threading.Lock()

# 假定这是你的银行存款:
balance = 0

def change_it(n):
    # 先存后取,结果应该为0:
    global balance
    balance = balance + n
    balance = balance - n

def run_thread(n):
    for i in range(100000):

        lock.acquire()
        try:
            change_it(n)
        finally:
            lock.release()
            

t1 = threading.Thread(target=run_thread, args=(5,))
t2 = threading.Thread(target=run_thread, args=(8,))
t1.start()
t2.start()
t1.join()
t2.join()
print(balance)

 

Guess you like

Origin http://43.154.161.224:23101/article/api/json?id=325879607&siteId=291194637