threading python2 和python3
阅读原文时间:2023年07月09日阅读:1
from __future__ import division
from __future__ import print_function                                           

import threading                                                                

balance = 0                                                                     

def change_it(n):
    global balance
    balance +=n
    balance -=n                                                                 

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

def create_thread():
    for i in range(30):
        t1 = threading.Thread(target=run_thread,args=(1,))
        t2 = threading.Thread(target=run_thread,args=(-1,))
        t1.start()
        t2.start()
        t1.join()
        t2.join()
        print(balance)                                                          

def _test_thread():
    create_thread()                                                             

def test():
    _test_thread()                                                              

test()

输出

Linux-4.15.0-36-generic-x86_64-with-Ubuntu-16.04-xenial
#39~16.04.1-Ubuntu SMP Tue Sep 25 08:59:23 UTC 2018
('64bit', 'ELF')
Python:2.7.12 (default, Dec  4 2017, 14:50:18)
[GCC 5.4.0 20160609]
6
6
-1
0
-28
-41
-40
-49
-56
-54
-60
-63
-68
-73
-69
-78
-53
-60
-53
-58
-48
-71
-82
-83
-130
-129
-111
-100
-84
-173


Linux-4.15.0-36-generic-x86_64-with-Ubuntu-16.04-xenial
#39~16.04.1-Ubuntu SMP Tue Sep 25 08:59:23 UTC 2018
('64bit', 'ELF')
Python:3.5.2 (default, Nov 23 2017, 16:37:01)
[GCC 5.4.0 20160609]
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0

加锁后

from __future__ import division
from __future__ import print_function                                           

import threading                                                                

balance = 0
lock = threading.Lock()                                                         

def change_it(n):
    global balance
    balance +=n
    balance -=n                                                                 

def run_thread(n):
    for i in range(10000):
        lock.acquire()
        try:
            change_it(n)
        finally:
            lock.release()                                                      

def create_thread():
    for i in range(30):
        t1 = threading.Thread(target=run_thread,args=(1,))
        t2 = threading.Thread(target=run_thread,args=(-1,))
        t1.start()
        t2.start()
        t1.join()
        t2.join()
        print(balance)                                                          

def _test_thread():
    create_thread()                                                             

def test():
    _test_thread()                                                              

test()

输出

Linux-4.15.0-36-generic-x86_64-with-Ubuntu-16.04-xenial
#39~16.04.1-Ubuntu SMP Tue Sep 25 08:59:23 UTC 2018
('64bit', 'ELF')
Python:2.7.12 (default, Dec  4 2017, 14:50:18)
[GCC 5.4.0 20160609]
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0


Linux-4.15.0-36-generic-x86_64-with-Ubuntu-16.04-xenial
#39~16.04.1-Ubuntu SMP Tue Sep 25 08:59:23 UTC 2018
('64bit', 'ELF')
Python:3.5.2 (default, Nov 23 2017, 16:37:01)
[GCC 5.4.0 20160609]
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0