首页 > 编程语言 >并发编程之多线程理论篇

并发编程之多线程理论篇

时间:2024-01-21 22:01:46浏览次数:30  
标签:__ 编程 print 并发 线程 进程 import 多线程

什么叫线程

线程也叫轻量级进程,是操作系统能够进行运算调度的最小单位,它被包含在进程之中,是进程中的实际运作单位。

线程自己不用有系统资源,只拥有一点在运行中必不可少的资源,但它可与同属一个一个进程的其他线程共享其所拥有的全部资源。一个线程可以创建和撤销另一个线程,同一个进程中的多个线程之间可以并发执行。

为什么要使用多线程

线程在程序中是独立的、并发的执行流。与分隔的进程相比,进程中线程之间的隔离程度药效,它们共享内存、文件句柄和其他进程应有的状态。
因为线程的划分程度小于进程,使得多线程程序的并发性高。进程在执行过程之中拥有独立的内存单元,而多个线程共享内存,从而极大的提升了程序的运行效率。
线程比进程具有更高的性能,这是由于同一个进程中的线程都有共性,多个线程共享一个进程的虚拟空间。线程的共享环境包括进程代码段、进程的共有数据等,利用这些共享的数据,线程之间很容易实现通信。
操作系统在创建进程时,必须为改进程分配独立的内存空间,并分配大量的相关资源,但创建线程则简单得多。因此,使用多线程来实现并发比使用多进程的性能高得要多。

总结起来,使用多线程编程具有如下几个优点:
1. 进程之间不能共享内存,但线程之间共享内存非常容易。
2. 操作系统在创建进程时,需要为该进程重新分配系统资源,但创建线程的代价则小得多。因此使用多线程来实现多任务并发执行比使用多进程的效率高
3. python语言内置了多线程功能支持,而不是单纯地作为底层操作系统的调度方式,从而简化了python的多线程编程。

线程的创建开销

问题一:创建进程的开销要远大于线程?

如果我们的软件是一个工厂,该工厂有多条流水线,流水线工作需要电源,电源只有一个即cpu(单核cpu)。
一个车间就是一个进程,一个车间至少一条流水线(一个进程至少一个线程);创建一个进程,就是创建一个车间(申请空间,在该空间内建至少一条流水线);而建线程,就只是在一个车间内造一条流水线,无需申请空间,所以创建开销小。

问题二:进程之间是竞争关系,线程之间是协作关系?

车间直接是竞争/抢电源的关系,竞争(不同的进程直接是竞争关系,是不同的程序员写的程序运行的,迅雷抢占其他进程的网速,360把其他进程当做病毒干死) 一个车间的不同流水线式协同工作的关系(同一个进程的线程之间是合作关系,是同一个程序写的程序内开启动,迅雷内的线程是合作关系,不会自己干自己)

线程和进程的区别

  • 开进程的开销远大于开线程
import time
from multiprocessing import Process
from threading import Thread


def piao(name):
    print('%s piaoing' % name)
    time.sleep(2)
    print('%s piao end' % name)


if __name__ == '__main__':
    # p1 = Process(target=piao, args=('allen',))
    # p1.start()

    t1 = Thread(target=piao, args=('allen',))
    t1.start()
    print('主线程')
  • 同一进程内的多个线程共享该进程的地址空间
from multiprocessing import Process
from threading import Thread

n = 100

def task():
    global n
    n = 0

if __name__ == '__main__':
    p1 = Process(target=task, )
    p1.start()
    p1.join()

    print('主进程', n)

    t1 = Thread(target=task, )
    t1.start()
    t1.join()

    print('主线程', n)

# 主进程 100
# 主线程 0
  • 进程PID、线程PID
import os
from multiprocessing import current_process, Process


def task():
    print(current_process().pid)
    print('子进程的PID:%s    父进程的PID:%s' % (os.getpid(), os.getppid()))


if __name__ == '__main__':
    p1 = Process(target=task, )
    p1.start()

    print('主线程', current_process().pid)
    print('主线程', os.getpid())

结果:
主线程 13712
主线程 13712
7240
子进程的PID:7240    父进程的PID:13712
import os
from threading import Thread


def task():
    print('子线程:%s' % (os.getpid()))


if __name__ == '__main__':
    t1 = Thread(target=task, )
    t1.start()

    print('主线程', os.getpid())

结果:
子线程:13912
主线程 13912

什么叫多线程

多任务:边吃饭边玩手机
现实生活中有很多这样同时做多件事情的例子,看起来是多个任务都在做,其实本质上我们的额大脑在同一时间依旧只做了一件事。

多线程(Thread):一条路多个道;游戏每个人都有一个账号,两个人同时玩一个游戏;编程main主函数和子函数同时运行

image

标签:__,编程,print,并发,线程,进程,import,多线程
From: https://www.cnblogs.com/xiao01/p/17978440

相关文章

  • 并发编程之守护线程
    无论是进程还是线程,都遵循:守护xxx会等待主xxx运行完毕后被销毁需要强调的是:运行完毕并非终止运行#1.对主进程来说,运行完毕指的是主进程代码运行完毕#2.对主线程来说,运行完毕指的是主线程所在的进程内所有非守护线程统统运行完毕,主线程才算运行完毕#1主进程在其代码结束后就......
  • 并发编程之多线程操作篇
    多线程简单介绍多线程,或者说多任务,指的是操作系统同时运行多个任务。例如,听歌、洗衣服、看视频可以同时进行,这种就是多任务。单核CPU执行多任务:操作系统轮流让各个任务交替执行,任务1执行t1时间,切换到任务2,任务2执行t2时间,再切换到任务3,执行t3时间...如此反复执行,表面上看,每个任......
  • 并发编程之操作系统引入
    一、引言顾名思义,进程就是正在执行的一个过程。进程是对正在运行程序的一个抽象说法。所谓进程,起源于操作系统最核心的概念,操作系统的其他所有内容都是围绕进程的概念展开的。所以想要真正了解进程,必须事先了解操作系统。二、为什么要有操作系统现代的计算机系统主要是由一个......
  • 并发编程之多进程理论篇
    引言进程是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是......
  • JUC并发编程 线程中断介绍及相关Api方法
    什么是中断机制首先,一个线程不应该由其他线程来强制中断或停止,而是应该由线程自己自行停止,自己来决定自己的命运,所以,Thread.stop,Thread.suspend,Thread.resume都已经被废弃了其次,在Java中没有办法立即停止一条线程,然而停止线程却显得尤为重要,如取消一个耗时操作。因此,Java提供......
  • Win32 编程 Windows API 使用(二)
     有了上一章的实验,我们来创建第一个自己设计的窗口按照之前的步骤,再创建一个新的项目,文件名称是app.cpp(也可以是app.c),并将这个类取名为MyApp,即最后运行的程序为MyAPP.exe 运行一遍发现这个窗口没法拖动,也没办法关闭。但是,窗口也确实显示出来了。#include<window......
  • Win32 编程 Windows API 使用(一)
    1.WindowAPI通常,Win32是指WindowsAPI,也指MicrosoftWindows操作系统的32位环境,和Win64 Windows常见环境。早期的操作系统为16位(window1.0),Win98/XP之后出现32位和64位,Win32即也是32位和64位的统称。所谓Win32编程,即主要使用GUI构图,编写一套程序。除了使用原生的Wind......
  • C++多线程3
    1利用栈特性自动释放锁RAII1.1什么是RAIIRAII(ResourceAcquisitionIsInitialization),使用局部对象管理资源的技术称为资源获取既初始化,它的生命周期由操作系统管理,无需人工干预。为什么要引入自动释放锁,因为我们有时会因为忘记释放锁,而造成死锁或内存泄漏。我们先来手动实......
  • 多线程与多进程
    多线程和多进程爬虫在很多场景中,爬虫需要抓取大量的数据,而且需要做大量的分析工作。如果只使用单线程的爬虫,效率会非常低。通常有实用价值的爬虫会使用多线程或多进程,这样可以很多工作同时完成,尤其在多CPU的机器上,执行效率更是惊人。一、线程与进程1、进程计算机程序有静态和......
  • AOP 编程
    AOP编程目录AOP编程1.AOP和OOP2.AOP中的一些概念术语通知类型3.AOP实现方式4.AOP使用1.添加依赖:在项目的pom.xml文件中添加SpringAOP依赖,以确保AOP模块可用。2.创建切面类:创建一个Java类,并使用@Aspect注解标记它,这个类将充当切面。1.AOP和OOPAOP为AspectOrie......