1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 | import time, threading #新线程执行的代码: def loop(): print ( 'thread %s is running...' % threading.current_thread().name) n = 0 while n < 5 : n = n + 1 print ( 'thread %s >>> %s' % (threading.current_thread().name, n)) time.sleep( 1 ) print ( 'thread %s ended.' % threading.current_thread().name) print ( 'thread %s is running...' % threading.current_thread().name) t1 = threading.Thread(target = loop, name = 'LoopThread1' ) t1.start() t2 = threading.Thread(target = loop, name = 'LoopThread2' ) t2.start() t3 = threading.Thread(target = loop, name = 'LoopThread3' ) t3.start() t4 = threading.Thread(target = loop, name = 'LoopThread4' ) t4.start() t1.join() t2.join() t3.join() t4.join() print ( 'thread %s ended.' % threading.current_thread().name) |
由于任何进程默认就会启动一个线程,我们把该线程称为主线程,主线程又可以启动新的线程,Python的threading模块有个current_thread()函数,它永远返回当前线程的实例。主线程实例的名字叫MainThread,子线程的名字在创建时指定,我们用LoopThread命名子线程。名字仅仅在打印时用来显示,完全没有其他意义,如果不起名字Python就自动给线程命名为Thread-1,Thread-2……
Lock
多线程和多进程最大的不同在于,多进程中,同一个变量,各自有一份拷贝存在于每个进程中,互不影响,而多线程中,所有变量都由所有线程共享,所以,任何一个变量都可以被任何一个线程修改,因此,线程之间共享数据最大的危险在于多个线程同时改一个变量,把内容给改乱了。来看看多个线程同时操作一个变量怎么把内容给改乱了:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | 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) |
结果跑出来会不一样,可以给线程加lock解决问题 因为这个现在还不怎么用到 所以就不深究了 可以在这里查看
http://www.liaoxuefeng.com/wiki/0014316089557264a6b348958f449949df42a6d3a2e542c000/00143192823818768cd506abbc94eb5916192364506fa5d000