python 线程 Thread

启动线程- threading

  • 将函数传入并创建Thread实例,然后调用start()
threading.Thread(group=None,target=None,name=None,args=(),kwsrgs{})
  • groupNone被保留用来未来实现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)

你可能感兴趣的:(Python基础)