启动线程- threading
- 将函数传入并创建
Thread
实例,然后调用start()
threading.Thread(group=None,target=None,name=None,args=(),kwsrgs{})
group
为None
被保留用来未来实现ThreadGroup类的扩展target
为被run()``方法调用的对象。默认为
None`,表示不调用任何东西。name
是线程的名字,可以自己设定,python默认为:Thread-N
,N为十进制数。args
:表示被调用的函数的参数,为一个元祖kwargs
:给调用目标的关键字参数的字典,默认为{}
- 任何进程默认会启动一个线程,该线程未主线程,名字是:MainThread
,主线程可以启动新线程,子线程的名字在创建的时候创建。
import time,threading
def loop():
"""
#新线程的执行代码
:return: 无返回
"""
print('线程%s运行中----'% threading.current_thread().name)#返回当前线程的实例
n=0
while n<5:
n=n+1
print('线程 %s>>>%s' %(threading.current_thread().name,n))
time.sleep(1)
print('线程%s结束了' %threading.current_thread().name)
print('线程%s运行中----'% threading.current_thread().name)
t=threading.Thread(target=loop,name='child')
t.start()
t.join()
print('线程%s结束了' %threading.current_thread().name)
输出:
线程MainThread运行中----
线程child运行中----
线程 child>>>1
线程 child>>>2
线程 child>>>3
线程 child>>>4
线程 child>>>5
线程child结束了
线程MainThread结束了
线程锁 LOCK
当多个线程一起执行时,就有可能会出现变量的值不太常理出牌。
这个时候就需要一个锁把线程锁住,先把当前的执行完了,再执行别的。但是这样就不能该保证并发,同时也可以使用锁把不同的线程锁在一起,但是也会出现每个线程都被锁着,一直转转转。
举个例子吧:
import time, threading
# 假定这是你的银行存款:
balance = 0
lock = threading.Lock()
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)