1> 多进程

① 导入进程包

import multiprocessing

② Process进程类

Process([group [, target [, name [, args [, kwargs]]]]])

参数 说明
group 指定进程组,目前智能使用None
target 指定目标任务名
name 进程名字
args 以元祖方式执行传参
kwargs 以字典方式执行传参

实例对象的常用方法

方法 说明
start() 启动子进程实例
join() 等待子进程执行结束
terminate() 终止子进程
import multiprocessing
import time
import os

def dance():
    # 获取当前的进程编号
    print('dance:',os.getpid())
    # 获取当前进程
    print('dance:',multiprocessing.current_process())
    for i in range(3):
        print('跳舞中')
        time.sleep(0.5)

def sing():
    # 获取当前的进程编号
    print('sing:',os.getpid())
    # 获取当前进程
    print('sing:',multiprocessing.current_process())
    for i in range(3):
        print('唱歌中')
        time.sleep(0.5)

if __name__ == '__main__':
    dance_progress = multiprocessing.Process(target=dance, name='process1')
    sing_progress = multiprocessing.Process(target=sing)
    dance_progress.start()
    sing_progress.start()

③ 执行带参数的任务

import multiprocessing
import time
import os

def dance(count):
    # 获取当前的进程编号
    print('dance:',os.getpid())
    # 获取当前进程
    print('dance:',multiprocessing.current_process())
    for i in range(count):
        print('跳舞中')
        time.sleep(0.5)

def sing(count):
    # 获取当前的进程编号
    print('sing:',os.getpid())
    # 获取当前进程
    print('sing:',multiprocessing.current_process())
    for i in range(count):
        print('唱歌中')
        time.sleep(0.5)

if __name__ == '__main__':
    dance_progress = multiprocessing.Process(target=dance, name='process1',args = (3,))
    sing_progress = multiprocessing.Process(target=sing,kwargs = {'count':3})
    dance_progress.start()
    sing_progress.start()

2> 线程

① 导入线程模块

import threading

② thread线程类

Thread([group [, target [, name [, args [, kwargs]]]]])

参数 说明
group 指定线程组,目前智能使用None
target 指定目标任务名
name 线程名字
args 以元祖方式执行传参
kwargs 以字典方式执行传参
import threading
import time,os

def dance():
    # 获取当前的进程编号
    print('dance:',os.getpid())
    # 获取当前进程
    print('dance:',threading.current_thread())
    for i in range(3):
        print('跳舞中')
        time.sleep(0.5)

def sing():
    # 获取当前的进程编号
    print('sing:',os.getpid())
    # 获取当前进程
    print('sing:',threading.current_thread())
    for i in range(3):
        print('唱歌中')
        time.sleep(0.5)

if __name__ == '__main__':
    dance_thread = threading.Thread(target=dance)
    sing_thread = threading.Thread(target=sing)
    dance_thread.start()
    sing_thread.start()

③ 执行带参数的任务

import threading
import time,os

def dance(count):
    # 获取当前的进程编号
    print('dance:',os.getpid())
    # 获取当前进程
    print('dance:',threading.current_thread())
    for i in range(3):
        print('跳舞中')
        time.sleep(0.5)

def sing(count):
    # 获取当前的进程编号
    print('sing:',os.getpid())
    # 获取当前进程
    print('sing:',threading.current_thread())
    for i in range(3):
        print('唱歌中')
        time.sleep(0.5)

if __name__ == '__main__':
    dance_thread = threading.Thread(target=dance,args=(3,))
    sing_thread = threading.Thread(target=sing,kwargs={'count':3})
    dance_thread.start()
    sing_thread.start()

3> 互斥锁

保证同一时刻只能有一个线程去操作

# 创建锁
lock = threading.Lock()
# 上锁
lock.acquire()
# 释放锁
lock.release()
import threading
import time,os

g_num = 10

# 创建全局锁
lock = threading.Lock()
def add1():
    # 上锁
    lock.acquire()
    for i in range(3):
        global g_num
        g_num += 1
    print(g_num)
    lock.release()

def add2():
    # 上锁
    lock.acquire()
    for i in range(3):
        global g_num
        g_num += 2
    print(g_num)
    lock.release()

if __name__ == '__main__':
    add1_thread = threading.Thread(target=add1)
    add2_thread = threading.Thread(target=add2)
    add1_thread.start()
    add2_thread.start()

4> 进程和线程的区别

关系 区别 优缺点
线程依附在进程里,没有进程就没有线程; 一个进程默认提供一条线程, 进程可以创建多条线程; 进程之间不共享全局变量; 线程之间共享全局变量; 线程占用资源大; 进程:可以用多核,占用资源大; 线程:不能使用多核,占用资源小;