python 多线程笔记
多进程demo
一般情况下用于CPU密集型,如图像处理、视频编码、科学计算等
"""
多进程demo
一般情况下用于CPU密集型,如图像处理、视频编码、科学计算等
"""
import multiprocessing
import os
import time
def do_someting(name, do_something, times):
print(f"{name} 正在启动, 当前进程id: {os.getpid()}")
print(f"{name} 正在启动, 父进程id: {os.getppid()}")
for i in range(times):
print(f"{name} 正在 {do_something} 第 {i + 1} s")
time.sleep(1)
if __name__ == "__main__":
# 采用元组方式传参
zh_san = multiprocessing.Process(target=do_someting, args=("张三", "买菜", 2))
# 采用字典方式传参
li_si = multiprocessing.Process(target=do_someting, kwargs={"name": "李四", "do_something": "买书", "times": 4})
zh_san.start()
li_si.start()
控制台输出
张三 正在启动, 当前进程id: 23480
张三 正在启动, 父进程id: 8992
张三 正在 买菜 第 1 s
李四 正在启动, 当前进程id: 12456
李四 正在启动, 父进程id: 8992
李四 正在 买书 第 1 s
张三 正在 买菜 第 2 s
李四 正在 买书 第 2 s
李四 正在 买书 第 3 s
李四 正在 买书 第 4 s
多线程demo
一般情况用于I/O密集型任务:如:网络请求、文件读写、数据库操作、GUI应用程序
"""
多进程demo
一般情况用于I/O密集型任务:如:网络请求、文件读写、数据库操作、GUI应用程序
"""
import threading
import time
def do_someting(name, do_something, times):
for i in range(times):
print(f"{name} 正在 {do_something} 第 {i + 1} s")
time.sleep(1)
if __name__ == '__main__':
zh_san = threading.Thread(target=do_someting, args=("张三", "打羽毛球", 2))
li_si = threading.Thread(target=do_someting, kwargs={"name": "李四", "do_something": "看电影", "times": 4})
zh_san.start()
li_si.start()
控制台输出
张三 正在 打羽毛球 第 1 s
李四 正在 看电影 第 1 s
张三 正在 打羽毛球 第 2 s
李四 正在 看电影 第 2 s
李四 正在 看电影 第 3 s
李四 正在 看电影 第 4 s
线程间共享变量
采用共同操作全局变量来实现共享变量,会有并发安全问题
"""
线程间共享变量
"""
import threading
counter = 0
def increment():
global counter
for _ in range(10000):
temp = counter
counter = temp + 1
if __name__ == '__main__':
threads = []
for i in range(1000):
t = threading.Thread(target=increment)
threads.append(t)
t.start()
for t in threads:
t.join()
print(f"最终结果为:{counter}") # 最终结果为:10000000
线程间的锁
"""
线程锁
"""
import threading
counter = 0
# 锁
lock = threading.Lock()
def increment():
global counter
for _ in range(100000):
# 加锁
with lock:
counter += 1
if __name__ == '__main__':
threads = []
for i in range(10):
t = threading.Thread(target=increment)
threads.append(t)
t.start()
for t in threads:
t.join()
print(f"最终结果为:{counter}")
多线程获取结果
通过 ThreadPoolExecutor 可以等待线程完成并且获取结果
"""ThreadPoolExecutor 多线程获取结果"""
from concurrent.futures import ThreadPoolExecutor
def worker(num):
return num * num
if __name__ == '__main__':
with ThreadPoolExecutor(max_workers=2) as executor:
future = executor.submit(worker, 5) # 提交任务
result = future.result() # 获取结果(阻塞状态)
print("子线程返回结果",result) # 子线程返回结果 25