learnpy 2020-07-19
参考:https://www.liaoxuefeng.com/wiki/1016959663602400/1017629247922688
多任务可以由多进程完成,也可以由一个进程内的多线程完成。
进程是由若干线程组成的,一个进程至少有一个线程。
threading
import time import threading # 新线程执行的代码 def loop(n: int): print(f‘线程{threading.current_thread().name} 正在运行...‘) while n < 5: n = n + 1 print(f‘线程{threading.current_thread().name}>>>{n}‘) time.sleep(1) print(f‘线程{threading.current_thread().name} 结束。‘) # current_thread() 返回当前线程的实例 print(f‘主线程{threading.current_thread().name}正在运行‘) # target=线程需执行的方法, name=线程的名字(线程的名字仅用于打印显示), args=(执行函数的参数,) t = threading.Thread(target=loop, name=‘LoopThread‘, args=(0, )) t.start() t.join() # 任何进程都会默认启动一个线程,这里启动的就是 MainThread , 主线程中可以启动新的线程 print(f‘主线程{threading.current_thread().name}结束‘)
运行结果:
/Users/zy7y/PycharmProjects/demo/venv/bin/python /Users/zy7y/PycharmProjects/demo/threading_demo.py 主线程MainThread正在运行 线程LoopThread 正在运行... 线程LoopThread>>>1 线程LoopThread>>>2 线程LoopThread>>>3 线程LoopThread>>>4 线程LoopThread>>>5 线程LoopThread 结束。 主线程MainThread结束 Process finished with exit code 0
Lock
多进程中,同一个变量,在每一个进程中,互不影响。
多线程中,所有变量都由
所有线程共享
,即任何一个变量都可以被任何一个线程修改
,线程之间共享数据最大的危险
在于多个线程同时改一个变量
import time import threading # 银行存款 balance = 0 # 锁实例 lock = threading.Lock() def change_it(n: int): # 先存后取,结果应该为0 # global 全局(共享)变量: global balance balance = balance + n balance = balance - n def run_thread(n: int): for i in range(1000000): # 获取锁 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)