多线程简介

进程 process : 一个程序的执行实例 拥有字节独立资源,数据和主进程
线程 thread : 同一进程可被并行激活的控制流,共享相同空间地址,数据结构
(注:存在Python GIL 全局解释器锁 全局而言,本质上一个线程执行)

为了节约资源的使用, 在一个进程中往往存在多个线程,那如何实现多线程操作?

1.使用import Threading.thread()建立线程

import time
impoer threading

def worker(n):
    print(f"函数开始执行于:{time.ctime()}")
    print('当前线程的名字是: ', threading.current_thread().name)  #获取当前线程名称
    time.sleep(n)
    print (f"函数结束于:{time.ctime()},前线程的名字是: '{threading.current_thread().name}")


def main():
    print(f"主函数开始{time.ctime()}")

    threads=[]                                        #使之同时启动
    
    t1=threading.Thread(target=worker,args=(4,))      #traget参数,执行函数。args传递参数
    threads.append(t1)

    t2 = threading.Thread(target=worker, args=(2,))
    threads.append(t2)

    for t in threads:
        t.start()

    for t in threads:
        t.join()

    print(f"主函数结束于{time.ctime()}")

if __name__ == '__main__':
    main()

2 通过派生类实用线程

import threading
import time

def worker(n):
    print(f"函数开始执行于:{time.ctime()}")
    print('当前线程的名字是: ', threading.current_thread().name)
    time.sleep(n)
    print (f"函数结束于:{time.ctime()},前线程的名字是: '{threading.current_thread().name}")


class MyThread(threading.Thread):
    def __init__(self,func,args):
        threading.Thread.__init__(self)
        self.func = func
        self.args = args

    def run(self):                                    #定义线程启动函数,和下文对应star相呼应
        self.func(*self.args)
def main():
    print(f"主函数开始{time.ctime()}")

    threads=[]                                        #使之同时启动
   
    t1=MyThread(worker,args=(4,))
    threads.append(t1)
    t2 = MyThread(worker, args=(2,))
    threads.append(t2)

    for t in threads:
        t.start()

    for t in threads:
        t.join()

    print(f"主函数结束于{time.ctime()}")

if __name__ == '__main__':
    main()

3 同步锁 threading.Lock()
将多线程锁住,使得信息流通不出现问题

eggs=[]
lock = threading.Lock()         #锁

def put_egg(n,lst):
    lock.acquire()             #锁上
    for i in range(1,n+1):
        time.sleep(random.randint(0,2))
        lst.append(i)
    lock.release()
def main():
    threads=[]

    for i in range(3):
        t=threading.Thread(target=put_egg,args=(5,eggs))
        threads.append(t)
    for t in threads:
        t.start()
    for t in threads:
        t.join()
    print(eggs)


if __name__ == '__main__':
    main()
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章