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