python的多进程(第二篇)特殊用法

1,进程之间不共享全局变量

  • 创建子进程其实是对主进程进行拷贝,进程之间互相独立,访问的全局变量不是同一个,所以进程之间不共享全局变量

2,主进程会等待所有的子进程执行完成程序再退出

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("主进程执行完成了啦")
  • 执行结果
工作中...
工作中...
工作中...
工作中...
工作中...
主进程执行完成了啦
工作中...
工作中...
工作中...
工作中...
工作中...

2.1,销毁子进程代码(类似于线程守护)

方法一:
设置守护主进程,主进程退出后子进程直接销毁,不再执行子进程中的代码
work_process.daemon = True
方法二:
让子进程直接销毁,表示终止执行, 主进程退出之前,把所有的子进程直接销毁就可以了     
work_process.terminate()

3,进程之间通信

3.1 可以使用multiprocessing模块的Quess实现多进程之间的数据传递,Quess本身是一个消息队列程序,首先用一个小实例来演示Quess的工作原理

# 创建消息队列, 3:表示队列中最大消息个数
queue = multiprocessing.Queue(3)
# 放入数据
queue.put(数据)   会进行等待
queue.put_nowait(数据)  不会进行等待
1,队列中可以放入任意数据类型
2,如果队列满了,需要等待队列有空闲位置才能放入数据,否则一直等待
3,如果队列满了,不等待的话,放入不成功会直接崩溃
# 查看队列的个数
print(queue.qsize())
# 获取数据
queue.get()
queue.get_nowait()
1,如果队列空了,在屈指需要等待,只有队列有值以后才能获取队列中的数据
2,如果不等待队列有值,队列中为空值会直接报错

注意点

  • 初始化对象的时候,Queue()没有上线的时候,说明可接受的消息没有数量的上限(知道内存的尽头)
  • Queue.empty() 如果队列为空,返回值为true 反之为false;
  • Queue.full() 如果队列满了,返回true,反之为flase;
  • Queue.get([block[,timeout]]) 从队列中获取信息,然后从队列中移除,block默认值为true;
block为默认值
1,如果没有设置timeout,程序会阻塞程序会停在读取状态,直到从消息队列中读取到信息,如果设置了时间,等待时间到了,还没有读取到信息,会抛出Queue.Empty异常
2,没有设置timeout,消息队列没有空间可写入程序会阻塞,直到消息队列腾出空间为止,如果设置timeout,会等待timeout秒,则会抛出Queue.Full异常
block为flase
1,消息队列为空也就是没有空间可以写入的时候,会立即抛出Queue.Empty异常
2,消息队列为空也就是说没有消息可以读取,会立即抛出Queue.Empty异常
Queue.get_nowait() = Queue.get(flase)
Queue.put_nowait(item) = Queue.put(item,False)

3.2 怎么理解

理论性的东西,能记住除非天天用,总结才是最关键,上面解释说到的,无非就是一个读取等待和写入等待,处理不好就会是Queue.Empty的异常,默认情况下我们使用true,不要尝试去使用Flase,会让你很头疼

3.3 怎么使用

import multiprocessing
import time


# 写入数据
def write_data(queue):
    for i in range(10):
        if queue.full():
            print("队列满了")
            break
        queue.put(i)
        time.sleep(0.2)
        print(i)


# 读取数据
def read_data(queue):
    while True:
        # 加入数据从队列取完了,那么跳出循环
        if queue.qsize() == 0:
            print("队列空了")
            break
        value = queue.get()
        print(value)


if __name__ == '__main__':
    # 创建消息队列
    queue = multiprocessing.Queue(5)

    # 创建写入数据的进程
    write_process = multiprocessing.Process(target=write_data, args=(queue,))
    # 创建读取数据的进程
    read_process = multiprocessing.Process(target=read_data, args=(queue,))

    # 启动进程
    write_process.start()
    # 主进程等待写入进程执行完成以后代码再继续往下执行
    write_process.join()
    read_process.start()
  • 运行结果
0
1
2
3
4
队列满了
0
1
2
3
4
队列空了

小结

  • 我们在使用队列的时候,放入数据需要等待一下(睡眠),判断队列状态一般不使用Queue.Empty() 这个方法容易不准确,使用Queue.Full()
  • 放入数据用put(),取出数据用get()
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Python 中有多种方法可以实现多进程,包括使用 `os.fork()`、`multiprocessing` 模块和 `concurrent.futures` 模块等。 1. 使用 `os.fork()` `os.fork()` 是一个 Unix 系统调用,它可以复制当前程,创建一个新程。父程和子程会共享代码段,但是各自有独立的数据段和堆栈段。在 Python 中,可以通过 `os.fork()` 实现多进程,示例代码如下: ```python import os pid = os.fork() if pid == 0: # 子程 print('I am child process, my pid is', os.getpid()) else: # 父程 print('I am parent process, my pid is', os.getpid(), 'and my child pid is', pid) ``` 2. 使用 `multiprocessing` 模块 `multiprocessing` 模块是 Python 内置的多进程模块,可以很方便地实现多进程。示例代码如下: ```python import multiprocessing def worker(): print('I am child process, my pid is', os.getpid()) if __name__ == '__main__': # 创建子程 p = multiprocessing.Process(target=worker) # 启动子程 p.start() # 等待子程结束 p.join() # 父程 print('I am parent process, my pid is', os.getpid()) ``` 3. 使用 `concurrent.futures` 模块 `concurrent.futures` 模块是 Python 内置的线程池和程池模块,可以很方便地实现异步任务。示例代码如下: ```python import concurrent.futures def worker(): print('I am child process, my pid is', os.getpid()) if __name__ == '__main__': # 创建程池 with concurrent.futures.ProcessPoolExecutor() as executor: # 提交异步任务 future = executor.submit(worker) # 等待任务完成 result = future.result() # 父程 print('I am parent process, my pid is', os.getpid()) ``` 以上是三种常用的 Python 多进程实现方式,具体选用哪种方式,需要根据实际情况来决定。需要注意的是,在 Windows 平台上,由于 `os.fork()` 不被支持,因此不能使用第一种方式创建多进程。 ### 回答2: Python多进程是指利用Python编程语言提供的多进程模块来实现并行计算。Python多进程模块主要包括了`multiprocessing`和`concurrent.futures`两个子模块,用于实现多进程的创建、启动和管理。 使用Python多进程可以带来多个优点。首先,使用多进程可以充分利用多核处理器的计算资源,提高程序的运行效率。其次,多进程可以实现程序的并行计算,将计算任务分配到多个程中同时执行,从而缩短程序的运行时间。同时,多进程还可以解决Python的全局解释锁(GIL)问题,使得并行计算更加高效。 在Python中,使用多进程可以通过以下几个步骤实现。首先,需要导入`multiprocessing`或`concurrent.futures`模块。然后,通过创建`Process`或`Executor`对象来创建程。接下来,可以使用`start()`方法启动程,使用`join()`方法等待程结束。同时,还可以使用`Process`或`Executor`对象提供的其他方法来管理程的状态和结果。 除了基本的多进程操作外,Python多进程模块还提供了一些辅助功能,如程间通信、程池等。程间通信可以通过`Queue`、`Pipe`等来实现,用于实现程之间的数据交换。而程池可以通过`Pool`来实现,用于管理多个程的执行和返回结果。 总之,Python多进程是一种并行计算的方法,可以充分利用计算资源和提高程序的运行效率。通过多进程的方式,可以实现更快速和有效的数据处理和计算。 ### 回答3: Python 多进程是指在一个 Python 程序中同时运行多个程的能力。多进程可以充分利用多核处理器,并且能够提高程序的运行效率和性能。 在 Python 中,我们可以使用 `multiprocessing` 模块来实现多进程。通过创建多个程,每个程都拥有独立的内存空间和数据栈,可以同时运行不同的任务。 使用 `multiprocessing` 模块,我们可以创建一个程池,通过调用其 `Pool` 类的 `map()` 或 `apply()` 方法,将任务分配给程池中的不同程来并行执行。这样,我们可以有效地利用多个 CPU 核心,提高程序的运行效率。 需要注意的是,每个程都有自己独立的内存空间,因此在多进程编程时,需要特别注意程间的数据共享和同步问题。在多进程编程中,常用的同步机制包括锁、信号量、事件等,可以通过 `multiprocessing` 模块中的相关类来实现。 此外,多进程编程还可以一步拓展为分布式程编程,即将程分布在多台机器上运行,通过网络行通信和协调。在 Python 中,可以使用 `multiprocessing` 模块中的 `Manager` 类来实现分布式程。 总的来说,Python多进程编程能够提高程序的执行效率和性能,特别适合于那些需要大量计算的任务,如数据处理、图像处理等。通过合理地运用多进程,并结合适当的同步机制,我们可以充分发挥多核处理器的潜力,提高程序的运行效率和吞吐量。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值