多进程和多线程的使用
多进程:
# 1、导入模块
import multiprocessing
import time
# 定义一个working任务
def working():
for i in range(10):
print('working子进程正在运行...')
time.sleep(1)
# 定义程序入口文件
if __name__ == '__main__':
# 默认进入的是主进程
print('主进程开始执行')
# 2、创建working子进程
working_process = multiprocessing.Process(target=working)
# 方案一:把子进程设置为守护进程
# 方案二:在主进程结束之前,强制终止子进程的执行 working_process.terminate()
working_process.daemon = True
# 3、启动子进程
working_process.start()
# 休眠
time.sleep(5)
# 主进程结束
print('主进程执行结束')
多线程:
# 1、导入模块
import threading
import time
# 定义函数(子线程执行的任务)
def working():
for i in range(10):
print('working子线程任务...')
time.sleep(1)
if __name__ == '__main__':
# 默认进入主线程
print('主线程开始执行')
# 2、创建线程对象
# 方案一:守护主线程
# working_thread = threading.Thread(target=working, daemon=True)
working_thread = threading.Thread(target=working)
# 方案二:守护主线程
working_thread.setDaemon(True)
working_thread.start()
# 3、休眠5秒
time.sleep(5)
print('主线程执行结束')
import threading
import time
def thread_job():
print('T1 start')
for i in range(5):
time.sleep(0.1)
print('T1 finishi')
def main():
thread1 = threading.Thread(target=thread_job,name='T1')
thread1.start()
thread1.join() #本句的作用是等thread1线程都执行完毕后在执行‘all done’的打印
print('all done')
if __name__=='__main__'
main()
互斥锁
mutex = Lock() # 实例化lock类,创建锁
mutex.acquire() # 抢锁
mutex.release() # 释放锁
进程线程间的消息通讯
"""
进程间通讯:from multiprocessing import Queue
线程间通讯:from queue import queue
"""
初始化Queue()对象时(例如:q=Queue(num)),若括号中没有指定最大可接收的消息数量,或数量为负值,那么就代表可接受的消息数量没有上限(知道内存的尽头)。
Queue的常用方法如下:
- Queue.qsize():返回当前队列包含的消息数量。
- Queue.empty():如果队列为空,返回True,反之返回False。
- Queue.full():如果队列满了,返回True,反之返回False。
- Queue.get([block[,timeout]]):获取队列中的一条消息,然后将其从队列中移除,block默认值为True。
①如果block使用默认值,却没有设置timeout(单位秒),消息队列为空,此时程序将被阻塞(停在读取状态),直到从消息队列读到消息为止。如果设置了timeout,则会等待timeout秒,若还没读取到任何消息,则抛出 "Queue.Empty" 异常。
②如果block值为False,消息队列为空,则会立刻抛出 "Queue.Empty" 异常。 - Queue.get_nowait(): 相当于Queue.get(False)。
- Queue.put(item,[block[,timeout]]): 将item消息写入队列,block默认值为True。
①如果block使用默认值,且没有设置timeout(单位秒),消息队列如果已经没有空间可写入,此时程序将被阻塞(停在写入状态),知道从消息队列腾出空间为止,如果设置了timeout,则会等待timeout秒,若还没空间,则抛出 "Queue.Full" 异常。
②如果block值为False,消息队列没有空间可写入,则会立刻抛出 "Queue.Full" 异常。
③Queue.put_nowait(item): 相当于 Queue.put(item,False).