当前位置:首页 > 编程笔记 > 正文
已解决

Python 笔记03(多线程)

来自网友在路上 165865提问 提问时间:2023-09-26 13:55:10阅读次数: 65

最佳答案 问答题库658位专家为你答疑解惑

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

windows + r

命令行输入:cmd + ipconfig

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

ipconfig

二 函数式多进程

from multiprocessing import Process
import os, timedef func(name):print('进程的ID:', os.getpid())print('父进程的ID:', os.getppid())print('当前进程的名称:', name)time.sleep(3)if __name__ == '__main__':# aprocess_lst = []for i in range(10):p = Process(target=func, args=(f'进程的名称为:{i}',))  # 默认调用init# 启动进程p.start()process_lst.append(p)for p in process_lst:p.join()    # 阻塞主进程,等待P进程执行完后继续print('主进程结束!')

三 继承式多进程

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

from multiprocessing import Process
import time, osclass MyProcess(Process):def __init__(self, name):  # 初始化方法, 创建MyProcess时被调用Process.__init__(self)   # 调用父类的初始化self.name = name# 继承式必须重写run方法def run(self):print('进程的ID:', os.getpid())print('父进程的ID:', os.getppid())print('当前进程的名称:', self.name)time.sleep(3)if __name__ == '__main__':process_lst = []for i in range(10):p = MyProcess(f'进程的名称:{i}')p.start()process_lst.append(p)for p in process_lst:p.join()print('主进程执行完毕')

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

from multiprocessing import Process, Queue
import os
import random# 入队的进程
class WriteProcess(Process):def __init__(self, name, q):Process.__init__(self)self.name = nameself.q = qdef run(self):print(f'进程的名称:{self.name}, 进程的ID:{os.getpid()}')# 入队操作for i in range(1, 6):x = random.randint(1000, 6666)print(f'入队元素:{x}')self.q.put(x)print('入队执行结束')# 出队的进程
class ReadProcess(Process):def __init__(self, name, q):Process.__init__(self)self.name = nameself.q = qdef run(self):print(f'进程的名称:{self.name}, 进程的ID:{os.getpid()}')# 入队操作for i in range(1, 6):print(f'出队元素---------->{self.q.get()}')  # get是队列的方法if __name__ == '__main__':# 主程序queue = Queue()  ## 创建子进程的对象write_process = WriteProcess('writer', queue)read_process = ReadProcess('reader', queue)# 启动进程write_process.start()read_process.start()

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

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

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

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

from multiprocessing import Process, Pipe
import osclass WriteProcess(Process):def __init__(self, name, pipe):Process.__init__(self)self.name = nameself.p = pipe  # pipe 是方法的局部变量,而self.p是类的实例属性,可以在类的任意方法中使用,而PIPE只能在init中使用def run(self):print(f'进程的名称:{self.name}, 进程的ID:{os.getpid()}')for i in range(1, 9):# 调用管道发送数据的方法: sendself.p.send(i)print(f'写入进程执行完毕')class ReadProcess(Process):def __init__(self, name, pipe):Process.__init__(self)self.name = nameself.p = pipedef run(self):print(f'进程的名称:{self.name}')for i in range(5):print(f'出队元素:{self.p.recv()}')  # recv()接收数据if __name__ == '__main__':#p1, p2 = Pipe()  # p1, p2指管道的两点,每一端对应一个进程wb = WriteProcess('writer', p1)rp = ReadProcess('reader', p2)# 启动进程wb.start()rp.start()

六 进程池

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

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

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

查看全文

99%的人还看了

猜你感兴趣

版权申明

本文"Python 笔记03(多线程)":http://eshow365.cn/6-13993-0.html 内容来自互联网,请自行判断内容的正确性。如有侵权请联系我们,立即删除!