玩命加载中🤣🤣🤣

python 多线程demo


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

线程间的事件监听

跳转至 threading-Event 监听事件


文章作者: 👑Dee👑
版权声明: 本博客所有文章除特別声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来源 👑Dee👑 !
  目录