多进程完成多任务
# 导入进程模块
import multiprocessing
import time
# 编写代码
def coding():
for i in range(3):
print(f"coding...{i}")
time.sleep(0.2)
# 听音乐
def music():
for i in range(3):
print(f"music...{i}")
time.sleep(0.2)
if __name__ == '__main__':
# coding()
# music()
# 通过进程类创建进程对象
coding_process = multiprocessing.Process(target=coding)
# 通过进程类创建进程对象
music_process = multiprocessing.Process(target=music)
# 启动进程
coding_process.start()
music_process.start()
进程执行带有参数的任务
# 导入进程模块
import multiprocessing
import time
# 编写代码
def coding(num, name):
for i in range(num):
print(f"name:{name}00{i+1}")
print("coding...")
time.sleep(0.2)
# 听音乐
def music(count):
for i in range(count):
print("music...")
time.sleep(0.2)
if __name__ == '__main__':
# coding()
# music()
# 通过进程类创建进程对象
coding_process = multiprocessing.Process(target=coding, args=(3, "不当大哥好多年"))
# 通过进程类创建进程对象
music_process = multiprocessing.Process(target=music, kwargs={"count": 2})
# 启动进程
coding_process.start()
music_process.start()
获取进程编号
# 导入进程模块
import multiprocessing
import time
import os
# 编写代码
def coding():
print("coding>>>%d" % os.getpid())
for i in range(3):
print("coding>>>%d" % os.getpid())
print("coding...")
time.sleep(0.2)
# 听音乐
def music():
for i in range(3):
print("music>>>%d" % os.getpid())
print("music...")
time.sleep(0.2)
if __name__ == '__main__':
# coding()
# music()
# 通过进程类创建进程对象
coding_process = multiprocessing.Process(target=coding)
# 通过进程类创建进程对象
music_process = multiprocessing.Process(target=music)
# 启动进程
coding_process.start()
music_process.start()
进程间不共享全局变量
import multiprocessing
import time
# 全局变量
my_list = []
# 写入数据
def write_data():
for i in range(3):
my_list.append(i)
print("add:", i)
print("write_data", my_list)
# 读取数据
def read_data():
print("read_data", my_list)
if __name__ == '__main__':
# 创建写入数据进程
write_process = multiprocessing.Process(target=write_data)
# 创建读取数据进程
read_process = multiprocessing.Process(target=read_data)
# 启动进程执行相应任务
write_process.start()
time.sleep(1)
read_process.start()```
## 主进程和子进程的结束顺序
```python
import multiprocessing
import time
# 工作函数
def work():
for i in range(10):
print("工作中...")
time.sleep(0.2)
if __name__ == '__main__':
# 创建子进程
work_process = multiprocessing.Process(target=work)
# 启动子进程
work_process.start()
# 延时1秒
time.sleep(1)
print("主进程执行完毕")
设置守护主进程
import multiprocessing
import time
# 工作函数
def work():
for i in range(10):
print(f"工作中...{i}")
# time.sleep(0.001)
# 工作函数
def work2():
for i in range(30):
print(f"work2工作中...{i}")
time.sleep(0.1)
print("over")
# 工作函数
def work3():
for i in range(30):
print(f"work3工作中...{i}")
time.sleep(0.2)
print("over")
if __name__ == '__main__':
# 创建子进程
work_process = multiprocessing.Process(target=work)
work_process2 = multiprocessing.Process(target=work2)
work_process3 = multiprocessing.Process(target=work3)
# # 设置守护主进程
# work_process.daemon = True
# 启动子进程
work_process.start()
work_process2.start()
work_process3.start()
# 延时1秒
# time.sleep(1)
# 手动结束子进程
work_process.terminate()
print("主进程执行完毕")
多线程完成多任务
import time
import threading
# 编写代码
def coding():
for i in range(3):
print("coding...")
time.sleep(0.2)
# 听音乐
def music():
for i in range(3):
print("music...")
time.sleep(0.2)
if __name__ == '__main__':
# coding()
# music()
# 创建子线程
coding_thread = threading.Thread(target=coding)
music_thread = threading.Thread(target=music)
# 启动子线程执行任务
coding_thread.start()
music_thread.start()
线程执行带有参数的任务
import time
import threading
# 编写代码
def coding(num):
for i in range(num):
print("coding...")
time.sleep(0.2)
# 听音乐
def music(count):
for i in range(count):
print("music...")
time.sleep(0.2)
if __name__ == '__main__':
# coding()
# music()
# 创建子线程
coding_thread = threading.Thread(target=coding, args=(3,))
music_thread = threading.Thread(target=music, kwargs={"count" : 1})
# 启动子线程执行任务
coding_thread.start()
music_thread.start()
主线程和子线程的结束顺序
import time
import threading
def work():
for i in range(10):
print(f"work...{i}")
time.sleep(0.2)
if __name__ == '__main__':
# 创建子线程
# 方式1 参数方式设置守护主线程
# work_thread = threading.Thread(target=work, daemon=True)
work_thread = threading.Thread(target=work)
# 启动线程
# 方式2
work_thread.setDaemon(True)
work_thread.start()
# 延时一秒
time.sleep(1)
print("主线程执行完毕")
线程间执行顺序
import threading
import time
# 获取线程信息函数
def get_info():
time.sleep(0.5)
# 获取线程信息
current_thread = threading.current_thread()
print(current_thread)
if __name__ == '__main__':
# 创建子线程
for i in range(10):
sub_thread = threading.Thread(target=get_info)
sub_thread.start()
线程间共享全局变量
import threading
import time
# 全局变量
my_list = []
# 写入数据
def write_data():
for i in range(3):
print("add:", i)
my_list.append(i)
print("write:", my_list)
# 读取数据
def read_data():
print("read:", my_list)
if __name__ == '__main__':
# 创建子线程
write_thread = threading.Thread(target=write_data)
read_thread = threading.Thread(target=read_data)
# 启动线程
write_thread.start()
# 延时一秒
time.sleep(1)
read_thread.start()
线程之间共享全局变量数据出现错误问题
import threading
# 全局变量
g_num = 0
# 对g_num进行加操作
def sum_num1():
for i in range(1000000):
global g_num
g_num += 1
print("g_num1:", g_num)
# 对g_num进行加操作
def sum_num2():
for i in range(1000000):
global g_num
g_num += 1
print("g_num2:", g_num)
if __name__ == '__main__':
# 创建子线程
sum1_thread = threading.Thread(target=sum_num1)
sum2_thread = threading.Thread(target=sum_num2)
# 启动线程
sum1_thread.start()
sum2_thread.start()
互斥锁
import threading
# 全局变量
g_num = 0
# 对g_num进行加操作
def sum_num1():
# 上锁
mutex.acquire()
for i in range(1000000):
global g_num
g_num += 1
# 解锁
mutex.release()
print("g_num1:", g_num)
# 对g_num进行加操作
def sum_num2():
# 上锁
mutex.acquire()
for i in range(1000000):
global g_num
g_num += 1
# 解锁
mutex.release()
print("g_num2:", g_num)
if __name__ == '__main__':
# 创建锁
mutex = threading.Lock()
# 创建子线程
sum1_thread = threading.Thread(target=sum_num1)
sum2_thread = threading.Thread(target=sum_num2)
# 启动线程
sum1_thread.start()
sum2_thread.start()
死锁
import threading
# 全局变量
g_num = 0
# 对g_num进行加操作
def sum_num1():
# 上锁
print("sun_num1...")
mutex.acquire()
for i in range(1000000):
global g_num
g_num += 1
# mutex.release()
print("g_num1:", g_num)
# 对g_num进行加操作
def sum_num2():
# 上锁
print("sun_num2...")
mutex.acquire()
for i in range(1000000):
global g_num
g_num += 1
# mutex.release()
print("g_num2:", g_num)
if __name__ == '__main__':
# 创建锁
mutex = threading.Lock()
# 创建子线程
sum1_thread = threading.Thread(target=sum_num1)
sum2_thread = threading.Thread(target=sum_num2)
# 启动线程
sum1_thread.start()
sum2_thread.start()
多线程之join
import time
from multiprocessing import Process
def task():
for i in range(10):
time.sleep(1)
print(f'子 run--{i}')
if __name__ == '__main__':
p = Process(target=task)
p.start() # 向操作系统发送指令
p.join() # 让主进程等待子进程执行完毕再继续向下执行
time.sleep(3)
print('over')