解决线程间资源争夺问题的另一种方法:互斥锁
#创建锁 mutex = threading.Lock() # 锁定 mutex.acquire() # 释放 mutex.release()
死锁:当互斥锁使用不当时有可能产生死锁
例:
#导入模块 import threading # 互斥锁 lock = threading.Lock() # 获取列表中的元素 def get_value(index): my_list = [1, 2, 3, 4, 5] # print("线程", index) # 同一时间只有一个线程通过下标读取数据操作 lock.acquire() # 判断是否列表越界 if index >= len(my_list): print("列表越界:", index) lock.release() """ 如果这里不写解锁的话,会导致线程一直处于锁死状态,形成死锁 """ return # 通过下标获取列表中的元素 print(my_list[index]) lock.release() if __name__ == '__main__': # 定义10个线程 执行get_value for i in range(10): # 创建一个子线程 sub_thread = threading.Thread(target=get_value, args=(i,)) # 启动下 sub_thread.start()
多进程完成多任务(进程的创建与线程类似)
import multiprocessing, time def work1(): for i in range(15): # 运行状态 print("工作1....") # 等待状态 time.sleep(0.1) def work2(): for i in range(15): print("工作2....") time.sleep(0.1) if __name__ == '__main__': # 创建两个子进程完成各自的任务 # 新建状态 work1_process = multiprocessing.Process(target=work1) work2_process = multiprocessing.Process(target=work2) # 启动进程 就绪状态 work1_process.start() work2_process.start()
多线程的使用格式
查看当前进程:multiprocessing.current_process()
查看当前进程ID:multiprocessing.current_process().pid
查看当前进程ID:os.getpid()
查看父进程ID:os.getppid()
主进程守护:work_process.daemon = True
多个进程对全局变量的操作时相对独立的,不会相互影响
多进程和多线程的区别:
多进程在某个进程崩溃时不会影响其他进程的运行
多项成在某个线程崩溃后整个程序就终止了
创建一个消息队列
# Queue(x) 可以存放x个元素 如果什么也不写 可以随意添加
queue = multiprocessing.Queue(3)
添加数据
queue.put(数据)
获取元素(先进先出)
queue.get()