搜索
写经验 领红包
 > 时尚

多线程实现的四种方式(多线程面试题)

在生活中,很多人可能想了解和弄清楚多线程的相关问题?那么关于多线程实现的四种方式的答案我来给大家详细解答下。

多线程实现的四种方式(多线程面试题)

在Python中,实现多任务还可以使用多线程来完成。

进程是分配资源的最小单位,线程是程序执行的最小单位。一个进程中最少有一个线程来负责执行程序。同属一个进程的多个线程共享进程所拥有的全部资源。

线程的创建步骤

1 导入线程模块

import threading

2 通过线程类创建线程对象

线程对象=threading.Thread(target=任务名)

target

执行的目标任务名,这里指的是函数名(方法名)

name

线程名,一般不用设置

group

线程组,目前 只能使用None

 创建子线程music_thread = threading.Thread(target=music) 编写代码def coding():    for i in range(3):        print(&34;)        time.sleep(0.2)34;music...&39;__main__& 创建子线程    coding_thread = threading.Thread(target=coding)     启动线程    coding_thread.start()    music_thread.start()

运行:

线程执行带有参数的任务

和进程一模一样

主线程和子线程的结束顺序

import threadingimport timedef work():    for i in range(10):        print(&34;)        time.sleep(0.2)if __name__ == &39;:     设置守护主线程方式,daemon=True  守护主线程    work_thread = threading.Thread(target=work,daemon=True)    work_thread.start()    34;主线程执行完成了啦& 通过current_thread方法获取线程对象current_thread = threading.current_thread()39;__main__& 定义全局变量my_list = []34;add:&34;write:& 读取数据def read_data():    print(&34;, my_list)if __name__ == &39;:     启动线程    write_thread.start()     全局变量g_num = 034;g_num1:& 对g_num进行加操作def sum_num2():    for i in range(1000000):        global g_num        g_num += 1    print(&34;, g_num)if __name__ == &39;:     启动线程    sum1_thread.start()    sum2_thread.start()

运行

当然这个结果每次都会变,这是因为两个线程都可以操作同一个全局变量,可能会出现全局变量的值还没有加上,另外一个线程已经获取值了,这时的值是上一次的值,就会出现少加1次,数据就出现了错误。

解决办法:

同步:就是协同步调,按预定的先后次序进行运作。

使用线程同步:保证同一时刻只能有一个线程去操作全局变量。

线程同步方式:互斥锁

互斥锁

对共享数据进行锁定,保证同一时刻只有一个线程去操作。

互斥锁是多个线程一起去抢,抢到锁的线程先执行,没有抢到锁的线程进行等待,等锁使用完释放后,其他等待的线程再去抢这个锁。

1.互斥锁的创建

mutex=threading.Lock()

2.上锁

mutex.acquire()

3.释放锁

mutex.release()

import threading 对g_num进行加操作def sum_num1():     解锁    mutex.release()    print(&34;, g_num) 上锁    mutex.acquire()    for i in range(1000000):        global g_num        g_num += 1    34;g_num2:&39;__main__& 创建锁    mutex = threading.Lock()     启动线程    sum1_thread.start()    sum2_thread.start()

运行:

死锁

一直等待对方释放锁的情景就是死锁。

import threading 对g_num进行加操作def sum_num1():    34;sum_num1...&34;g_num1:& 对g_num进行加操作def sum_num2():    34;sum_num1...&34;g_num2:&39;__main__& 创建锁    mutex = threading.Lock()     启动线程    sum1_thread.start()    sum2_thread.start()

可见产生了死锁。

温馨提示:通过以上关于多线程内容介绍后,相信大家有新的了解,更希望可以对你有所帮助。