并发编程——线程与进程,开启线程的两种方式,多线程与多进程

《Python 并发编程全景解析:多线程与多进程的区别、应用场景与最佳实践》 本文深入解析Python并发编程中的多线程与多进程机制,重点探讨GIL的影响、适用场景及性能优化。多线程适合I/O密集型任务(如网络请求),而多进程更适合CPU密集型计算。通过代码示例展示了线程与进程的实际应用,并提供了Web爬虫和数据分析的实战案例。文章还总结了最佳实践(如控制进程数量、避免线程安全问题)和前沿趋势(异步编程、分布式计算)。最后提出开放性问题,鼓励读者分享并发编程经验,帮助开发者根据任务特性选择合适的并发方案。 阅读详情

1 线程和进程

1、线程是一个基本的CPU执行单元,也是程序执行流的最小单元。
2、进程是拥有资源的基本单位,线程是独立调度的基本单位。
3、每启动一个进程,里面至少有一个线程,线程不拥有资源,但可以访问隶属于进程的系统资源。
4、创建或撤销进程(系统要为其分配或回收内存空间和资源),进程的切换,开销远大于线程。
5、同一进程内的多个线程共享进程的地址空间,共享进程的资源,线程之间通信容易实现。
6、进程内的线程对于其他进程不可见。

2 开启线程的两种方式threading模块,与进程方法类似

2.1 方式一:

from threading import Thread
import time

def test(name):
    print('%s is running' % name)
    time.sleep(2)
    print('%s is done' % name)

if __name__ =='__main__':
    t1 = Thread(target=test,args=('小明',))
    t1.start()
    print('主')
    
# 小明 is running
# 主
# 小明 is done

2.2 方式二:

class MyTest(Thread):
    def __init__(self, name):
        super().__init__()
        self.name = name

    def run(self):
        print('%s is running' % self.name)
        time.sleep(2)
        print('%s is done' % self.name)


if __name__ == '__main__':
    t1 = MyTest('小明')
    t1.start()
    print('主线程')


小明 is running
主线程
小明 is done

3 多线程与多进程的区别

3.1 进程开销大于线程

 def test():
    print('running')

if __name__ == '__main__':
    p1 = Process(target=test)
    p1.start()
    print('主进程')
    
# 主进程
# running
def test():
    print('running')


if __name__ == '__main__':
    t1 = Thread(target=test)
    t1.start()
    print('主线程')
    
# running
# 主线程

3.2 同一进程内的线程共享数据,进程之间数据隔离


def test():
    global n
    print('running')
    n = 0
    print('进程内:', n)


if __name__ == '__main__':
    n = 10
    p1 = Process(target=test)
    p1.start()
    p1.join()
    print('主进程:', n)
    
# running
# 进程内: 0
# 主进程: 10
def test():
    global n
    print('running')
    n = 0
    print('线程内:', n)


if __name__ == '__main__':
    n = 10
    t1 = Thread(target=test)
    t1.start()
    t1.join()
    print('主线程:', n)

# running
# 线程内: 0
# 主线程: 0

3.3 同一进程内线程pid一样,进程与进程的pid不一样

import os
import threading
import multiprocessing


def test():
    print('hello', '%s pid:' % threading.current_thread().getName(), os.getpid())


if __name__ == '__main__':
    t1 = Thread(target=test)
    t2 = Thread(target=test)
    t3 = Thread(target=test)
    t1.start()
    t2.start()
    t3.start()
    print('主线程:', os.getpid())
    
# hello Thread-1 pid: 26308
# hello Thread-2 pid: 26308
# hello Thread-3 pid: 26308
# 主线程: 26308
import os
import threading
import multiprocessing


def test():
    print('hello', '%s pid:' % multiprocessing.current_process().name, os.getpid())


if __name__ == '__main__':
    p1 = Process(target=test, name='p1')
    p2 = Process(target=test, name='p2')
    p3 = Process(target=test, name='p3')
    p1.start()
    p2.start()
    p3.start()
    print('主进程:', os.getpid())


# 主进程: 12516
# hello p1 pid: 46720
# hello p2 pid: 7540
# hello p3 pid: 29876
 

4 Thread对象其他属性或方法

Thread 对象的方法:

isAlive() :返回True or False 表示线程是否活动
getName():返回线程名
setName():设置线程名
join():等待线程运行结束

threading模块提供的方法:

threading.currentThead() :返回当前线程
threading.enumerate():返回正在运行的线程列表
threading.active_Count():返回正在运行的线程数

from threading import Thread, currentThread


def test():
    print('%s is running' % currentThread().getName())  # 打印当前线程名
    time.sleep(3)


if __name__ == '__main__':
    t1 = Thread(target=test)
    t2 = Thread(target=test)
    t1.start()
    t2.start()
    print(threading.enumerate())
    print(threading.active_count())
    print('主线程')

# Thread-1 is running
# Thread-2 is running
# [<_MainThread(MainThread, started 12992)>, <Thread(Thread-1, started 12680)>, <Thread(Thread-2, started 42892)>]
# 3
# 主线程
from threading import Thread, currentThread


def test():
    print('%s is running' % currentThread().getName())  # 打印当前线程名
    time.sleep(3)
    print('done')


if __name__ == '__main__':
    t1 = Thread(target=test)
    t1.setName('线程t1')
    t1.start()
    t1.join()
    print('主线程')
    
# 线程t1 is running
# done
# 主线程
def test():
    print('%s is running' % currentThread().getName())  # 打印当前线程名
    time.sleep(3)
    print('done')


if __name__ == '__main__':
    t1 = Thread(target=test)
    t1.start()
    print(t1.is_alive())
    print('主线程')
    
# Thread-1 is running
# True
# 主线程
# done
Linux下多进程多线程混合开发框架     多进程和多线程的概念相信大家都大致清楚,就不去百度copy了。这里引用一个比喻来描述下多进程和多线程:         多进程是立体交通系统,虽然造价高,上坡下坡多耗点油,但是不堵车。    多线程是平面交通系统,造价低,但红绿灯太多,老堵车。    我们现在都开跑车,油(主频)有的是,不怕上坡下坡,就怕堵车。     在多进程开发中,每个进程互相独立,不影响主程序的... 阅读详情

相关推荐

大疆上云API-1.10.0版本-设备位置数据实时处理与WebSocket推送实战解析

本文深入解析了大疆上云API 1.10.0版本中设备位置数据的实时处理与推送全链路。通过剖析源码,详细阐述了从MQTT接收OSD数据、Spring Integration路由分发、业务逻辑处理到WebSocket实时推送至前端地图的核心流程,并提供了实战优化与避坑指南,帮助开发者构建高可靠的无人机实时定位系统。

weixin_29291863的博客 413

多进程与多线程

多进程是指在操作系统中同时运行多个独立的进程,每个进程都有自己独立的内存空间和系统资源。进程是计算机中执行程序的实体,它包含了程序的代码、数据和执行状态等信息。在多进程编程中,可以将任务分配给不同的进程来并行执行,从而充分利用多核处理器的计算能力。每个进程都有自己的执行环境,它们之间相互独立,互不干扰。多进程之间可以通过进程间通信(IPC)机制来进行数据交换和同步操作。多进程可以提高程序的执行效率,特别适用于执行CPU密集型任务,如图像处理、数据计算、科学计算等。

weixin_39107270的博客 2877

数字通信:信源编码、信道编码、调制、物理信道、解调、信道解码、信源解码

在通信系统中,信息的传输通常需要经过一系列的处理步骤,确保数据可以在信道中高效且可靠地传输。以下是信源编码、信道编码、调制、物理信道、解调、信道解码、信源解码的具体含义及其常见技术的解释。

weixin_44012667的博客 4813

多进程及多线程的区别

一.两者区别 多进程和多线程的主要区别是:线程是进程的子集(部分),一个进程可能由多个线程组成。多进程的数据是分开的、共享复杂,需要用IPC;但同步简单。多线程共享进程数据,共享简单;但同步复杂。 (1)多进程 进程是程序在计算机上的一次执行活动,即正在运行中的应用程序,通常称为进程。当你运行一个程序,你就启动了一个进程。每个进程都有自己独立的地址空间(内存空间),每当用户启动一个进程时,操作系统就会为该进程分配一个独立的内存空间,让应用程序在这个独立的内存空间中运行。 在同一个时间里,同一个计算机系统中如

Welcome To kua_fuXz's Blog 1万+

告别“为了写而写”:GJB438C-2021新规下,软件文档如何真正为项目服务?

本文深入解析GJB438C-2021新规如何重构软件文档的实战价值,通过文档体系瘦身、流程再造和敏捷化实践,显著提升军工软件项目的效率。新标准删除30%冗余文档,引入动态编制法和轻量化模板,使文档编制工作量降低37%,关键路径周期缩短15%。

weixin_30765577的博客 448

AutoCAD2014与ObjectARX开发环境搭建实战指南

本文提供了一份详细的AutoCAD2014与ObjectARX开发环境搭建实战指南。内容涵盖从AutoCAD2014、Visual Studio 2010及ObjectARX 2014 SDK的版本匹配与环境准备,到Wizard安装、编码问题解决、Visual Studio配置,并最终通过一个完整的绘图命令开发示例,手把手引导开发者创建并加载第一个可运行的ObjectARX插件,为后续深入开发奠定坚实基础。

weixin_28475533的博客 288

多线程与多进程详细

一.进程和线程的概念 1.进程(最小的资源单位):   进程:就是一个程序在一个数据集上的一次动态执行过程。进程一般由程序、数据集、进程控制块三部分组成。     程序:我们编写的程序用来描述进程要完成哪些功能以及如何完成;     数据集;则是程序在执行过程中所需要使用的资源;     进程控制块:用来记录进程的外部特征,描述进程的执行变化过程,系统可以利用它来控制和管理进程,它是系统感知进程存在的唯一标志。   进程比线程更早出现,计算机早期处理代码时,使用的是串行的方法,假设计算机在运行A

Prince的博客 1万+

两层板如何做阻抗控制呢

两层板如何做阻抗控制呢? 这个问题可能很多人都会碰到,有的人在此等需要做阻抗控制的情况都选择做多层板。诚然,多层板在阻抗控制,EMC等等方面都有着天然的优势。然而,在价格上和周期上,两层板就有着绝对优势了。 对于成本非常敏感而又不是太复杂的产品,尽管对于我们硬件工程师而言,有一堆的理由要求使用多层板。然而在面对毛都不懂的老板“别人能做,你为什么不能做?”这个问题时只得低下我们高傲的头颅。 好...

weixin_42005993的博客 2万+

Python之多进程与多线程

前言:为什么有人说 Python 的多线程是鸡肋,不是真正意义上的多线程? 看到这里,也许你会疑惑。这很正常,所以让我们带着问题来阅读本文章吧。问题: 1、Python多线程为什么耗时更长? 2、为什么在Python里面推荐使用多进程而不是多线程? 1 基础知识 现在的PC都是多核的,使用多线程能充分利用CPU来提供程序的执行效率。 1.1 线程 线程是一个基本的CPU执行单元。...

ZONGXP的博客 6万+

文章ACCEPT之后填写内容教程-Springer-Verlag即施普林格

1. 确认corresponding author通讯作者机构是否正确(最好细分到系,如搜不到系只填大学也可)这些信息因为在投稿的时候都填过,所以一般都没问题,可确认并继续。2. Co-Author: 这篇文章有没有其他作者,如果有就选yes,并确认投稿时所填的作者姓名和机构是否正确。这个也是如果前期都填对了就不用修改。3. Research funders: 问文章的研究有没有资助,没有就选no,有就选yes,并填写机构名称和grant/contact numbers。

ZhangJiqun&191cm&85kg 4787

GRCNN抓取网络学习3【自制Jacquard数据集模型调优】

请先完成,这样有利于下面操作的理解!然后第二步是,有了自己的数据集输入到GRCNN中是三种文件,那么可以GRCNN抓取网络学习2【自制Jacquard数据集训练】!既然学会训练,那么开展下一步计划模型调优。GRCNN源码:https://github.com/skumra/robotic-grasping。

vor234的博客 2502

多线程(Threading)和多进程(Multiprocessing)

Python多线程高并发什么是多线程基本方法函数继承使用线程同步 什么是多线程 单线程: 在程序当中,只有一个箭头指向代码从头到尾执行。 import time def sorry(): print("Sorry") time.sleep(1) if __name__ == '__main__': for i in range(5): sorry() 依次打印五个sorry,每个间隔1秒 多线程: 在一个脚本当中,一次同时运行多个程序。 import time i

Hanhahahahah的博客 4005

杰理AC695N/AC696N/AC701N系列芯片在线调音教程

本教程详细介绍AC695N/AC696N/AC701N芯片在线音效调试方法,包括工具准备(需安装杰理包管理器)、程序修改(需关闭USB功能并启用在线调试宏)、连接方式(USB或串口)、音效调节步骤(EQ和混响参数调整)以及配置保存。注意事项包括版本匹配、连接检查和供电稳定等,并提供常见问题解决方案。适用于快速配置实时音效调试环境并保存最终配置。

qq_42014563的博客 1406

python ray定时_python并发编程之多线程

阅读目录一 threading模块介绍multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍二 开启线程的两种方式#方式一from threading import Threadimport timedef sayhi(name):time.sleep(2)print('%s say hello' %name)if __name__ ...

weixin_39581739的博客 257

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

Python-并发编程

Python_并发编程知识点

weixin_42160450的博客 193

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【Python测试开发】使用ProcessPoolExecutor或ThreadPoolExecutor实现多进程或多线程

并发编程会给我们的程序带来极大的性能提升,并发编程具有非常广泛的应用,比如服务器、网络爬虫、性能测试等。Python中并发编程的实现方式有:多线程、多进程以及协程。本文主要介绍多线程和多进程。 1. 几个重要概念 在python并发编程之前,我们需要明确和掌握几个重要的概念,并发与并行,同步和异步,阻塞与非阻塞。 1.1 并发执行和并行执行 并行(parallel): 指的是互不干扰的在同一时刻...

刘春明的博客 5610

怀旧版电脑GBC模拟器

再现原版GBC掌机的界面,电脑运行连游戏界面都一样大小,很怀旧,很真实,(英文版)强烈推荐,很小的文件,很难才找到的。

Python 多进程与多线程

Python 多进程与多线程

关于我的学习记录 1755

Python并发编程之多线程

本文介绍并发编程中另一个重要的知识 - 线程。我们知道一个程序的运行过程是一个进程,在操作系统中每个进程都有一个地址空间,而且每个进程默认有一个控制线程,打个比方,在一个车间中有很多原材料通过流水线加工产品,而线程就是这个车间中的流水线,而这个车间就是进程,原材料就是内存中的数据,每个车间至少有一条流水线。因此,进程只是将资源(原材料)集中到一起是资源单位,线程才是CPU具体的执行单位,一个进程中可以存在多个线程,这多个线程会共享该进程内的所有资源,因此同一个进程内开启多线程会产生资源争抢。

weixin_71807218的博客 2231

并发编程多进程之开启进程的两种方式

并发编程多进程之开启进程的两种方式 本节重点 掌握multiprocessing模块开启进程的两种方式 一、multiprocessing模块介绍 python中的多线程无法利用多核优势,如果想要充分的使用CPU的资源(os.cpu_count()查看),在python中大部分情况需要使用多进程。 python提供了multiprocessing。multiprocessing模块用来开...

唯美清泠 236

Python并发编程:多线程-进程池与线程池

基于多进程或多线程实现并发的套接字通信,这样的实现方式存在的缺陷是:服务开启的进程数或线程数都会随着并发的客户端数目的增多而增多,这会对服务端主机带来巨大的压力,甚至于不堪重负而瘫痪,于是我们必须对服务端开启的进程数或线程数加以控制,让机器在一个自己可以承受的范围内运行,这就是进程池或线程池的用途,例如进程池,就是用来存放进程的池子,本质还是基于多进程,只不过是对开启进程的数目加以限制。

liudefang的专栏 1218

这篇文章就是要让你入门java多线程【多线程入门】

就在前几天,有位朋友私信宜春,说期待出一篇多线程的文章,我当时内心是小鹿乱撞啊....于是这几天茶不思饭不想,好几天深夜皆是辗转反侧,两目深凝,以至于这几天走起路来格外飘飘然~我承认太夸张了,感觉又要被打~。最终还是君意不可违,答应了这位朋友,从这位朋友的头像可以看出来,这位朋友绝bi历经沧桑,对生活无尽的坦然浩对,看透俗世凡尘、世态炎凉、趋炎附势,拥有着极高的安心恬荡情怀...啥?啥子?这个是系统默认头像....那个那个宜春啥都没说哈,别把什么事都扯宜春身上,我啥都没说。。。。

宜春 1万+

python多进程与多线程

互联网上介绍多进程的文章很多,比如Python多进程 - 实现多进程的几种方式、python多进程并发、多进程。为什么自己记录呢,是因为在做多进程的时候总会遇到这样那样的问题,故只好亲自实践一下。 1 最简单的多进程 使用multiprocessing.Process定义进程,target参数传递的是进程执行的方法,args则是传递给执行方法的参数,这个参数不要太复杂,复杂类型就可能会报错。 im...

warrah 南极狼 433

多进程 VS 多线程

在Linux下编程多用多进程编程少用多线程编程。 IBM有个家伙做了个测试,发现切换线程context的时候,windows比linux快一倍多。进出最快的锁(windows2k的 critical section和linux的pthread_mutex),windows比linux的要快五倍左右。当然这并不是说linux不好,而且在经过实际编程之后,综合来看我觉得linux更...

有趣的人生 一半是山川湖海 一半是初心情怀 372

python之并发编程:多进程与多线程

一:多进程       进程(process),是计算机中已运行程序的实体,是线程的容器;一个进程至少有一个线程1,父进程与其子进程:       各进程的内存空间是互相隔离的       进程创建时,为该进程生成一个PCB(进程控制块);进程终止时,回收PCB。每个进程都有一个非负的唯一进程ID(PID)。虽然是唯一的,但是PID可以重用,当一个进程终止后,其他进程就可以使用它的PID了。   ...

Lee hua 532

Python并发编程_多进程、多线程、队列

1. 概述 非并发编程:程序由单个步骤序列构成,包含独立子任务的程序执行性能低。 并发编程:异步,高效,分解子任务,简化流程与逻辑 进程(process):一个程序的执行实例,每个进程都有自己的地址空间,内存,数据栈及辅助数据。 线程(thread):同一进程内,可被并行激活的控制流,共享相同的上下文(空间地址,数据结构) 多线程特点: 1. 便于信息共享和通信 2. 线程访问顺序不一致,会导致结...

qq_34229228的博客 349

python中的多线程与多进程

进程是操作系统资源分配的基本单位,而线程是任务调度和执行的基本单位。 在Java中比较关注多线程,而在Python中,与多线程相比,可能更关注多进程。 GIL 在非python环境中,单核情况下,同时只能有一个任务执行。多核时可以支持多个线程同时执行。但是在python中,无论有多少核,同时只能执行一个线程。究其原因,这就是由于GIL的存在导致的。 GIL的全称是Global Interpret...

xiaoyi52的专栏 362
上一篇: 并发编程——生产者消费者模型
下一篇: 并发编程——守护线程,互斥锁,死锁,递归锁,信号量,Event,定时器
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值