【python】多任务编程之线程、进程知识点详细总结

news2024/11/15 23:47:48

目录

多任务的执行方式

进程

概念

python多进程

线程

概念

python多线程

线程同步方式

线程等待

互斥锁

死锁

线程和进程对比


多任务的执行方式

进程

概念

python多进程

  • Windows下的main判断

  • process进程类

import multiprocessing
import time
def sing():
    for i in range(3):
        print(f"唱歌第{i}次")
        time.sleep(0.2)
def dance():
    for i in range(3):
        print(f"跳舞第{i}次")
        time.sleep(0.2)
if __name__ == '__main__':
    sing_pro = multiprocessing.Process(target=sing)
    dance_pro = multiprocessing.Process(target=dance)
    sing_pro.start()
    dance_pro.start()

注:此时唱歌和跳舞的优先度由系统调度决定(随机)

  • 获取进程id
import multiprocessing
import time
import os
def sing():
    print('sing的父进程id:',os.getppid())
    for i in range(3):
        print(f"唱歌第{i}次")
        time.sleep(1)
        os.kill(os.getpid(),9)
#       强制结束进程
def dance():
    for i in range(3):
        print(f"跳舞第{i}次")
        time.sleep(1)
if __name__ == '__main__':
    sing_pro = multiprocessing.Process(target=sing)
    dance_pro = multiprocessing.Process(target=dance)
    print("sing:", sing_pro)
    print("dance:", dance_pro)
    sing_pro.start()
    dance_pro.start()
    print("main:",os.getpid(),multiprocessing.current_process())

sing: <Process name='Process-1' parent=5920 initial>
dance: <Process name='Process-2' parent=5920 initial>
main: 5920 <_MainProcess name='MainProcess' parent=None started>
跳舞第0次
sing的父进程id: 5920
唱歌第0次
跳舞第1次
跳舞第2次

  • 带参任务的执行
import multiprocessing
def show(name,age):
    print(f"姓名:{name},年龄是{age}岁")
if __name__ == '__main__':
    show_pro1=multiprocessing.Process(target=show("coleak1",19))
    show_pro2=multiprocessing.Process(target=show,args=('coleak2',20))
    show_pro3=multiprocessing.Process(target=show,kwargs={"age":21,"name":'coleak3'})
    show_pro1.start()
    show_pro2.start()
    show_pro3.start()

姓名:coleak1,年龄是19岁
姓名:coleak2,年龄是20岁
姓名:coleak3,年龄是21岁

  • 注意点
  1. 进程间全局变量不共享
  2. 主进程会等待所有子进程执行结束后再结束
  3. 进程之间执行是无序的,由操作系统调度决定
import multiprocessing
import time
import multiprocessing
my_list=list()
def add():
    for i in range(3):
        my_list.append(i)
        print("add:",i)
        time.sleep(0.5)
    print(my_list)
def read():
    print("read:",my_list)
if __name__ == '__main__':
    p1 = multiprocessing.Process(target=add)
    p2 = multiprocessing.Process(target=read)
    p1.start()
    p1.join()
#当前进程等待p1进程执行结束后再执行
    p2.start()
    print("main:",my_list)

add: 0
add: 1
add: 2
[0, 1, 2]
main: []
read: []

import multiprocessing
import time
def test():
    for i in range(6):
        print(i)
        time.sleep(0.2)
if __name__ == '__main__':
    p1=multiprocessing.Process(target=test)
    p1.start()
    time.sleep(0.5)
    print('over!')

0
1
2
over!
3
4
5

  • 主进程退出,子进程销毁
import multiprocessing
import time
def test():
    while True:
        print('执行ing...')
        time.sleep(0.2)
if __name__ == '__main__':
    p1=multiprocessing.Process(target=test)
    p1.daemon=True
    # 子进程守护主进程
    p1.start()
    time.sleep(0.5)
    print('over!')

执行ing...
执行ing...
执行ing...
over!

import multiprocessing
import time
def test():
    while True:
        print('执行ing...')
        time.sleep(0.2)
if __name__ == '__main__':
    p1=multiprocessing.Process(target=test,name='coleak')
    p1.start()
    time.sleep(0.5)
    p1.terminate()
    print('over!')

执行ing...
执行ing...
执行ing...
over!

线程

概念

python多线程

import threading
import time
def sing():
    for i in range(3):
        print(f"唱歌第{i}次")
        time.sleep(0.2)
def dance():
    for i in range(3):
        print(f"跳舞第{i}次")
        time.sleep(0.2)
if __name__ == '__main__':
    t1=threading.Thread(target=sing)
    t2=threading.Thread(target=dance)
    t1.start()
    t2.start()

唱歌第0次跳舞第0次
唱歌第1次跳舞第1次

唱歌第2次跳舞第2次

import threading
import time
def test():
    t=threading.current_thread()
    print('test:',t)

if __name__ == '__main__':
    print("main:",threading.current_thread())
    t1=threading.Thread(target=test)
    t1.start()

main: <_MainThread(MainThread, started 3100)>
test: <Thread(Thread-1 (test), started 10836)>

  • 带参任务

同进程知识点

  • 注意点
  1. 线程之间执行是无序的,由cpu调度决定
  2. 主线程等子线程结束后再结束
  3. 线程之间共享全局变量
  4. 线程之间共享全局变量数据会出错
import threading
import time
def test():
    time.sleep(1)
    print(threading.current_thread())
if __name__ == '__main__':
    for i in range(20):
        t=threading.Thread(target=test)
        t.start()
  • demon守护主进程 
import threading
import time
def test():
    while True:
        print('执行ing...')
        time.sleep(0.2)
if __name__ == '__main__':
    p1=threading.Thread(target=test,daemon=True)
    p1.start()
    time.sleep(0.5)
    print('over!')
import threading
import time
def test():
    while True:
        print('执行ing...')
        time.sleep(0.2)
if __name__ == '__main__':
    p1=threading.Thread(target=test)
    p1.setDaemon(True)
    p1.start()
    time.sleep(0.5)
    print('over!')

执行ing...
执行ing...
执行ing...
over!

import threading
import time
def test():
    for i in range(3):
        my_list.append(i)
        print("add:",i)
if __name__ == '__main__':
    my_list = list()
    p1=threading.Thread(target=test)
    p1.start()
    time.sleep(1)
    print(my_list)

add: 0
add: 1
add: 2
[0, 1, 2]

import threading
import time
a=0
def test1():
    global a
    for i in range(1000000):
        a+=1
def test2():
    global a
    for i in range(1000000):
        a+=1
if __name__ == '__main__':
    p1=threading.Thread(target=test1)
    p2=threading.Thread(target=test2)
    p1.start()
    p2.start()
    print(a)

993031,和正确结果相差了近7000

线程同步方式

线程等待

  • join

互斥锁

  • 概念

  • 使用

import threading
import time
a=0
lock=threading.Lock()
def test1():
    lock.acquire()
    for i in range(1000000):
        global a
        a+=1
    # print(a)
    lock.release()
def test2():
    lock.acquire()
    for i in range(1000000):
        global a
        a+=1
    # print(a)
    lock.release()
if __name__ == '__main__':
    p1=threading.Thread(target=test1)
    p2=threading.Thread(target=test2)
    p1.start()
    p2.start()
    time.sleep(2)
    print(a,'over')

2000000 over

死锁

import threading
import time
lock=threading.Lock()
def get(index):
    my_list=[6,5,8,7]
    lock.acquire()
    if index>=len(my_list):
        print("下标越界",index)
        return
    print(my_list[index])
    lock.release()

if __name__ == '__main__':
    for i in range(10):
        p=threading.Thread(target=get,args=(i,))
        p.start()

6
5
8
7
下标越界 4 

  • 改进方案
import threading
import time
lock=threading.Lock()
def get(index):
    my_list=[6,5,8,7]
    lock.acquire()
    if index>=len(my_list):
        print("下标越界",index)
        lock.release()
        return
    print(my_list[index])
    lock.release()

if __name__ == '__main__':
    for i in range(10):
        p=threading.Thread(target=get,args=(i,))
        p.start()

6
5
8
7
下标越界 4
下标越界 5
下标越界 6
下标越界 7
下标越界 8
下标越界 9

线程和进程对比

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/188473.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Unix环境高级编程_进程环境_启动代码,环境变量表,进程内存结构,库

这是《UNIX环境高级编程》第7章内容&#xff0c;这篇文章记录进程所需要的环境。 4 进程环境 程序加载到内存&#xff0c;运行起来后就成为了进程。就像人活着需要生活环境&#xff08;衣食住行的环境&#xff09;一样&#xff0c;进程也需要运行环境&#xff0c;进程所需要的…

Vue组件生命周期与钩子函数

组件生命周期 ​ 组件&#xff08;组件是可复用的 Vue 实例&#xff09;从创建到销毁的过程就是组件的生命周期&#xff0c;是一个时间段。 组件生命周期钩子函数 &#xff08;vue3与vue2生命周期钩子函数略有不同&#xff0c;本文以vue2为主&#xff09; ​ VUE 提供的生命…

科研快报 | 三代测序技术-海水微生物态,助力海水微生态及微生物基因组研究

PacBio研究专题二代测序读长偏短&#xff0c;环境宏基因组样品研究受到了很大限制。作者通过三代测序对来自地中海的冬季混合海水样本进行宏基因组测序。利用PacBio Sequel II平台的超长读长明显可以提升宏基因组的组装质量&#xff0c;又能显著提升MAGs质量。研究人员通过比较…

使用和登录Linux云服务器

目录 云服务器的购买 SSH登录云服务器 云服务器的购买 我们以腾讯云为例, 其他的服务器厂商也是类似。 1. 进入腾讯云官方网站&#xff1a;学生云服务器_云校园特惠套餐 - 腾讯云 (tencent.com) 2. 登陆网站(可以使用微信登陆) 3.购买云服务器 购买最低级即可&#xff0c;对于…

python - 科研文献作图复现1

记录阅读文献过程中&#xff0c;通过python复现原文的一些脚本 想要复现的文章原图如下所示 原文链接&#xff1a; https://file.scirp.org/Html/4-2430166_82999.htm 首先&#xff0c;对于原图进行简要观察。 这是一张折线图&#xff0c;绘制了6条不同颜色的折线来表示不同…

舆情监控软件免费下载,TOOM网络舆情监控软件服务流程?

舆情监测可以帮助个人和企业了解自己的网络形象&#xff0c;提高自我评价和评价能力&#xff0c;提升自我定位和竞争力。接下来简单了解舆情监控软件免费下载&#xff0c;TOOM网络舆情监控软件服务流程? 一、舆情监控软件免费下载 请登录TOOM舆情官网获取链接 1.企业客户&a…

SpringMVC(十三):SpringMVC拦截器介绍使用

文章目录 SpringMVC拦截器介绍使用 前言 一、拦截器使用 二、拦截器内容详解 1、preHandle方法 2、postHandle方法 3、afterCompletion方法 三、多个拦截器执行顺序 SpringMVC拦截器介绍使用 前言 在之前的系列文章里&#xff0c;我们学习了过滤器的知识。过滤器的作…

ejs模板在Express框架中的集成

在上一篇内容中已经使用了pug模板&#xff0c;那么本篇就来了解一下ejs模板在Express框架中的集成使用&#xff0c;ejs模板也是常用的模板引擎&#xff0c;支持在标签内直接编写javascript代码&#xff0c;通过javascript代码就能够生成HTML页面的&#xff0c;通过本期对ejs模板…

C++字符串全排列(递归法)和(迭代法)以及next_permutation底层原理详解

目录前言next_permutation的使用实现全排列的两种算法1. 递归法(全排列方便理解记忆的方法&#xff0c;作为备用方法)实现代码(无重复元素情况)有重复元素情况2. 迭代法(next_permutation底层原理)实现代码(有无重复不影响)前言 next_permutation/prev_permutation是C STL中的…

全国青少年软件编程(Python)等级考试一级考试真题2022年12月——持续更新.....

1.关于Python语言的注释,以下选项中描述错误的是?( ) A.Python语言有两种注释方式:单行注释和多行注释 B.Python语言的单行注释以#开头 C.Python多行注释使用###来做为标记 D.注释用于解释代码原理或者用途 正确答案:C 2.下列代码执行后最有可能绘制出的图形是?(…

网络原理(TCP/IP五层协议)(三)

目录4.滑动窗口(效率机制)5.流量控制(安全机制)6.拥塞控制(安全机制)7.延迟应答(效率机制)8.捎带应答(效率机制)9.面向字节流10.TCP的异常处理4.滑动窗口(效率机制) 滑动窗口存在的意义就是在保证可靠性的前提下&#xff0c;尽量提高传输效率。 在这里可以看到&#xff0c;由于…

JSP 学生成绩管理系统myeclipse定制开发sqlserver数据库网页模式java编程jdbc

一、源码特点 JSP 学生成绩管理系统是一套完善的web设计系统&#xff0c;对理解JSP java编程开发语言有帮助&#xff0c;系统具有完整的源代码和数据库&#xff0c;系统主要采用B/S模式开发。开发环境为 TOMCAT7.0,Myeclipse8.5开发&#xff0c;数据库为SQLServer2008&#x…

layui 富文本layedit编辑、存储和回显

一、创建一个富文本编辑框 先定义一个textarea标签&#xff0c;给定一个id值&#xff0c;向页面引入layedit&#xff0c;然后调用layedit.build(id, options)构建富文本框 //官方给出的模板 <textarea id"demo" style"display: none;"></textar…

Linux的目录相关操作

目录 前言 处理目录的常见命令 cd&#xff08;change directory&#xff0c;切换目录&#xff09; pwd&#xff08;print working directory&#xff0c;显示目前所在的目录&#xff09; mkdir&#xff08;make directory&#xff0c;建立新目录&#xff09; rmdir&#x…

代码随想录算法训练营第十三天 | 第六章二叉树-理论基础,递归遍历,迭代遍历,统一迭代

一、参考资料二叉树理论基础文章讲解&#xff1a;https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%90%86%E8%AE%BA%E5%9F%BA%E7%A1%80.html 递归遍历题目链接/文章讲解/视频讲解&#xff1a;https://programmercarl.com/%E4%BA%8C%E5%8F%89%E6%A0%91%E7%9A%84%E9%8…

Mobilenet v1-v3

MobileNet V1 理解 MobileNetV1的关键是理解深度可分离卷积 深度可分离卷积 Depthwise Separable Conv 深度可分离卷积单通道卷积&#xff08;提取特征&#xff09;逐点卷积&#xff08;增加维度&#xff09; 普通卷积 输入一个 12123 的一个输入特征图&#xff0c;经过256…

微服务/分布式初始

1.单体服务架构的特点 当服务单一、规模小、逻辑简单时&#xff0c;用一个单体服务就挺 单体服务的缺点 复杂程度高。维护成本越来越高&#xff0c;各个模块之间边界模糊&#xff0c;一个模块的改动可能导致整个服务出现问题&#xff0c;一点内存泄漏、一处指针错误就会让整…

汉诺塔+汉诺四塔(C/C++)

目录 汉诺塔 1 简介 2 代码思路 2.1 对于次数的理解 2.2 对于移动的理解 3 代码 4 加深理解 汉诺四塔 1 思路 2 代码 汉诺塔 1 简介 汉诺塔(Tower of Hanoi)&#xff0c;又称河内塔&#xff0c;是一个源于印度古老传说的益智玩具。大梵天创造世界的时候做了三…

关于e^x的部分公式和约算方法

常用的几个不等式: ex≥x1e^{x}\geq x1ex≥x1ln⁡x≤x−1\ln x\leq x-1lnx≤x−1ex≥exe^{x} \geq exex≥exex≥1xx22e^x\geq1x\frac{x^2}{2}ex≥1x2x2​ 当x>0时&#xff0c;ex≥ex(x−1)2x2−(e−2)x1e^x\geq ex(x-1)^{2}x^2-(e-2)x1ex≥ex(x−1)2x2−(e−2)x1 上述算式在…

数据库系统概论——函数依赖、码和范式(1NF、2NF、3NF、BCNF)详解

文章目录概念回顾1、函数依赖的定义1.1 平凡函数依赖和非平凡函数依赖1.2 完全函数依赖和部分函数依赖1.3 传递函数依赖2、码2.1 主码和候选码2.1主属性与非主属性2.2 全码2.3 外部码3、范式3.1 第一范式&#xff08;1NF&#xff09;3.2 第二范式&#xff08;2NF&#xff09;3.…