多进程和多线程的使用

多进程:

# 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的常用方法如下:

  1. Queue.qsize():返回当前队列包含的消息数量。
  2. Queue.empty():如果队列为空,返回True,反之返回False。
  3. Queue.full():如果队列满了,返回True,反之返回False。
  4. Queue.get([block[,timeout]]):获取队列中的一条消息,然后将其从队列中移除,block默认值为True。
    ①如果block使用默认值,却没有设置timeout(单位秒),消息队列为空,此时程序将被阻塞(停在读取状态),直到从消息队列读到消息为止。如果设置了timeout,则会等待timeout秒,若还没读取到任何消息,则抛出 "Queue.Empty" 异常。
    ②如果block值为False,消息队列为空,则会立刻抛出 "Queue.Empty" 异常。
  5. Queue.get_nowait(): 相当于Queue.get(False)。
  6. 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).
posted @ 2021-09-14 23:31  kopok  阅读(58)  评论(0编辑  收藏  举报