• Python 笔记03(多线程)


    一 打开命令行,查看本机IP

    windows + r

    命令行输入:cmd + ipconfig

    然后查看IPv4的地址:192.168.1*6.1

    ipconfig

    二 函数式多进程

    1. from multiprocessing import Process
    2. import os, time
    3. def func(name):
    4. print('进程的ID:', os.getpid())
    5. print('父进程的ID:', os.getppid())
    6. print('当前进程的名称:', name)
    7. time.sleep(3)
    8. if __name__ == '__main__':
    9. # a
    10. process_lst = []
    11. for i in range(10):
    12. p = Process(target=func, args=(f'进程的名称为:{i}',)) # 默认调用init
    13. # 启动进程
    14. p.start()
    15. process_lst.append(p)
    16. for p in process_lst:
    17. p.join() # 阻塞主进程,等待P进程执行完后继续
    18. print('主进程结束!')

    三 继承式多进程

    p.join() 等待子进程结束后才进行下一步的操作

    1. from multiprocessing import Process
    2. import time, os
    3. class MyProcess(Process):
    4. def __init__(self, name): # 初始化方法, 创建MyProcess时被调用
    5. Process.__init__(self) # 调用父类的初始化
    6. self.name = name
    7. # 继承式必须重写run方法
    8. def run(self):
    9. print('进程的ID:', os.getpid())
    10. print('父进程的ID:', os.getppid())
    11. print('当前进程的名称:', self.name)
    12. time.sleep(3)
    13. if __name__ == '__main__':
    14. process_lst = []
    15. for i in range(10):
    16. p = MyProcess(f'进程的名称:{i}')
    17. p.start()
    18. process_lst.append(p)
    19. for p in process_lst:
    20. p.join()
    21. print('主进程执行完毕')

    四 进程间通信 (使用队列的方式, queue)

    1. from multiprocessing import Process, Queue
    2. import os
    3. import random
    4. # 入队的进程
    5. class WriteProcess(Process):
    6. def __init__(self, name, q):
    7. Process.__init__(self)
    8. self.name = name
    9. self.q = q
    10. def run(self):
    11. print(f'进程的名称:{self.name}, 进程的ID:{os.getpid()}')
    12. # 入队操作
    13. for i in range(1, 6):
    14. x = random.randint(1000, 6666)
    15. print(f'入队元素:{x}')
    16. self.q.put(x)
    17. print('入队执行结束')
    18. # 出队的进程
    19. class ReadProcess(Process):
    20. def __init__(self, name, q):
    21. Process.__init__(self)
    22. self.name = name
    23. self.q = q
    24. def run(self):
    25. print(f'进程的名称:{self.name}, 进程的ID:{os.getpid()}')
    26. # 入队操作
    27. for i in range(1, 6):
    28. print(f'出队元素---------->{self.q.get()}') # get是队列的方法
    29. if __name__ == '__main__':
    30. # 主程序
    31. queue = Queue() #
    32. # 创建子进程的对象
    33. write_process = WriteProcess('writer', queue)
    34. read_process = ReadProcess('reader', queue)
    35. # 启动进程
    36. write_process.start()
    37. read_process.start()

    五 管道的当时做通信 (pipe)

    1 需要在进程的init中配置:self.p = pipe 

    2 数据发送使用:p.send(value)

    3 数据接收使用: p.recv(value)

    1. from multiprocessing import Process, Pipe
    2. import os
    3. class WriteProcess(Process):
    4. def __init__(self, name, pipe):
    5. Process.__init__(self)
    6. self.name = name
    7. self.p = pipe # pipe 是方法的局部变量,而self.p是类的实例属性,可以在类的任意方法中使用,而PIPE只能在init中使用
    8. def run(self):
    9. print(f'进程的名称:{self.name}, 进程的ID:{os.getpid()}')
    10. for i in range(1, 9):
    11. # 调用管道发送数据的方法: send
    12. self.p.send(i)
    13. print(f'写入进程执行完毕')
    14. class ReadProcess(Process):
    15. def __init__(self, name, pipe):
    16. Process.__init__(self)
    17. self.name = name
    18. self.p = pipe
    19. def run(self):
    20. print(f'进程的名称:{self.name}')
    21. for i in range(5):
    22. print(f'出队元素:{self.p.recv()}') # recv()接收数据
    23. if __name__ == '__main__':
    24. #
    25. p1, p2 = Pipe() # p1, p2指管道的两点,每一端对应一个进程
    26. wb = WriteProcess('writer', p1)
    27. rp = ReadProcess('reader', p2)
    28. # 启动进程
    29. wb.start()
    30. rp.start()

    六 进程池

    1 p.apply(run, ('任务' + str(i),))   # 同步执行

    2 p.apply_async(run, ('任务' + str(i),))   # 异步执行

    1. # 函数式多进程
    2. from multiprocessing.pool import Pool
    3. import os, time, random
    4. def run(name):
    5. start = time.time() # 开始时间
    6. print(f'任务名称:{name}, 进程的ID:{os.getpid()}')
    7. time.sleep(random.choice([1, 2, 3, 4, 5])) # 注意choice 要有()
    8. end = time.time()
    9. print(f' ________________+ 任务名称:{name}, 进程的ID:{os.getpid()}, 耗时:{round(end - start, 2)}')
    10. if __name__ == '__main__':
    11. p = Pool(5) # 5个进程的进程池
    12. # 5个进程,10个任务
    13. for i in range(10):
    14. # p.apply_async(run, ('任务' + str(i),)) # 异步执行
    15. p.apply(run, ('任务' + str(i),)) # 同步执行
    16. p.close()
    17. p.join()
    18. print('主进程结束')

    七 多线程加锁

    1 lock = Lock()    # 上锁

    2 lock = BoundedSemaphore(3)   # 可以同时启动3个进程

    3 lock.acquire()    # 开始请求锁

    4 lock.release()     # 释放锁

    1. from threading import Thread, Lock, BoundedSemaphore
    2. import time
    3. # 函数实现多线程
    4. # lock = Lock()
    5. lock = BoundedSemaphore(3) # 可以同时启动3个进程
    6. def fun(num):
    7. lock.acquire()
    8. print(f"第{num}个人正在安检")
    9. time.sleep(3)
    10. print(f'-------> 第{num}个人安检完成')
    11. lock.release()
    12. if __name__ == '__main__':
    13. for i in range(10):
    14. t = Thread(target=fun, args=(i,))
    15. t.start()

  • 相关阅读:
    java毕业生设计在线商城系统计算机源码+系统+mysql+调试部署+lw
    python教程:*的用法,你可能错过了......
    鼠标悬停效果九
    数据结构——单向循环链表&双向循环链表
    「Qt Widget中文示例指南」如何模拟一个时钟?
    yolov5 Grad-CAM可视化,以及对可视化过程的分析
    字体管理工具 - RightFont使用教程
    Selenium —— Web自动化多浏览器处理!
    2023-09-24力扣每日一题
    elementUI el-table+树形结构子节点选中后没有打勾?(element版本问题 已解决)
  • 原文地址:https://blog.csdn.net/March_A/article/details/133280780