> 时尚
多线程实现的四种方式(多线程面试题)
在生活中,很多人可能想了解和弄清楚多线程的相关问题?那么关于多线程实现的四种方式的答案我来给大家详细解答下。
在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()
可见产生了死锁。
温馨提示:通过以上关于多线程内容介绍后,相信大家有新的了解,更希望可以对你有所帮助。