百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术流 > 正文

Python中实现多进程与多线程(python中多线程和多进程的应用场景)

citgpt 2024-09-09 02:16 7 浏览 0 评论

进程与线程

进程(process)就是任务,是计算机系统进行资源分配和调度的基本单位。比如,打开一个word文件就是启动了一个word进程。

线程(thread)是进程内的子任务。比如word中可以进行编辑、拼写检查和打印等子任务。

Python中实现多进程与多线程(python中多线程和多进程的应用场景)

我们目前的操作系统都是多任务的操作系统,多任务的实现方式:

多进程多线程多进程 + 多线程

多进程:multiprocessing模块

Unix Like系统中,可以用python中os模块的os.fork方法,为当前进程创建一个“子进程”,当前进程称作“父进程”。

说的简单一点,就是当你调用os.fork以后,会有两个进程运行这之后的代码,它们的pid(process id)不一样。

由于一些玄学或是一些不知名的原因,用这个方法以后,我心爱的mbp风扇呼呼响,所以只好作罢。

multiprocessing模块比os.fork好用的多,这个模块也可以用于创建多进程。而且它有一些基本的对象如Queue等支持进程间通信。下面主要讨论用multiprocessing模块怎么实现多进程。

创建一个子进程

multiprocessing.Process类可以初始化一个子进程,target参数传入子进程函数。

from multiprocessing import Processimport os, time

# 子进程函数

def sub_process: print('Sub Process (%s) Start!' % os.getpid) for i in reversed(range(3)): time.sleep(1) print(i+1) time.sleep(1) print('Over!')print('Main Prcess (%s) Start!' % os.getpid)for i in reversed(range(3)): time.sleep(1) print(i+1)time.sleep(1)print('GO!')time.sleep(1)p = Process(target=sub_process)# 子进程开始p.start# 等待子进程结束p.join

代码执行的效果如下:

创建多个子进程

multiprocessing.Pool类可以创建一个进程池,进程吃通过调用apply_async函数来创建一个新的进程。

from multiprocessing import Poolimport os,timedef sub_process(n): time.sleep(1) print('Process (%s) is running!' % os.getpid)# 指定同时运行的进程数p = Pool(4)for i in range(5): p.apply_async(sub_process,args=(i+1,))# 不能继续添加进程了p.closep.join

可以清晰的看见,我们指定了同时运行的进程数为4,因此最开始添加的4个进程都停了1秒就有了输出,而最后一个进程在1秒以后才有输出。

多线程:threading模块

多线程相比于多进程的好处是能更快一点,但是也没快多少。python中常用threading模块实现多线程。

import threading, timedef thread: print('%s is running' % threading.current_thread.name)print('%s is running' % threading.current_thread.name)time.sleep(1)t = threading.Thread(target=thread, name='Sub_Thread')t.startt.join

后记

当然多进程和多线程的内容远不止这些,其他的还有进程间通信、线程中的锁、ThreadLocal等。由于立下了一天写一篇文章的flag,如果一开始就把这件事搞得非常复杂就会损失做这个事的乐趣。所以我打算偷点懒,少点写,以后再增加工作量~

以上是酷仔今日整理的“Python中实现多进程与多线程”一文,希望为正在学习Python编程的同学提供参考。

相关推荐

js中arguments详解

一、简介了解arguments这个对象之前先来认识一下javascript的一些功能:其实Javascript并没有重载函数的功能,但是Arguments对象能够模拟重载。Javascrip中每个函数...

firewall-cmd 常用命令

目录firewalldzone说明firewallzone内容说明firewall-cmd常用参数firewall-cmd常用命令常用命令 回到顶部firewalldzone...

epel-release 是什么

EPEL-release(ExtraPackagesforEnterpriseLinux)是一个软件仓库,它为企业级Linux发行版(如CentOS、RHEL等)提供额外的软件包。以下是关于E...

FullGC详解  什么是 JVM 的 GC
FullGC详解 什么是 JVM 的 GC

前言:背景:一、什么是JVM的GC?JVM(JavaVirtualMachine)。JVM是Java程序的虚拟机,是一种实现Java语言的解...

2024-10-26 08:50 citgpt

使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
  • 使用Spire.Doc组件利用模板导出Word文档
跨域(CrossOrigin)

1.介绍  1)跨域问题:跨域问题是在网络中,当一个网络的运行脚本(通常时JavaScript)试图访问另一个网络的资源时,如果这两个网络的端口、协议和域名不一致时就会出现跨域问题。    通俗讲...

微服务架构和分布式架构的区别

1、含义不同微服务架构:微服务架构风格是一种将一个单一应用程序开发为一组小型服务的方法,每个服务运行在自己的进程中,服务间通信采用轻量级通信机制(通常用HTTP资源API)。这些服务围绕业务能力构建并...

深入理解与应用CSS clip-path 属性
深入理解与应用CSS clip-path 属性

clip-pathclip-path是什么clip-path 是一个CSS属性,允许开发者创建一个剪切区域,从而决定元素的哪些部分可见,哪些部分会被隐...

2024-10-25 11:51 citgpt

HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
  • HCNP Routing&Switching之OSPF LSA类型(二)
Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
  • Redis和Memcached的区别详解
Request.ServerVariables 大全

Request.ServerVariables("Url")返回服务器地址Request.ServerVariables("Path_Info")客户端提供的路...

python操作Kafka

目录一、python操作kafka1.python使用kafka生产者2.python使用kafka消费者3.使用docker中的kafka二、python操作kafka细...

Runtime.getRuntime().exec详解

Runtime.getRuntime().exec详解概述Runtime.getRuntime().exec用于调用外部可执行程序或系统命令,并重定向外部程序的标准输入、标准输出和标准错误到缓冲池。...

promise.all详解 promise.all是干什么的
promise.all详解 promise.all是干什么的

promise.all详解promise.all中所有的请求成功了,走.then(),在.then()中能得到一个数组,数组中是每个请求resolve抛出的结果...

2024-10-24 16:21 citgpt

Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解
  • Content-Length和Transfer-Encoding详解

取消回复欢迎 发表评论: