python高级-线程和进程相关

news2024/11/18 13:59:02

这里前面的linux基础就不补充了,只写一些比较高级的

目录

一、文件查找

1.按照名字查找

2.通配符

3.文件大小查找

二、压缩和打包

1.zip

2.gzip

3.tar命令

三、权限管理

四、多进程

1.创建进程

2.获取进程id

3.进程传参

4.进程不共享全局变量

5.守护进程

5.1.方式1

5.2.方式2

五、线程

1.线程创建

2.线程执行带有参数的任务

3.线程的无序性

4.守护主线程

5.阻塞线程

6.线程间共享全局变量

7.多线程中共享变量的资源竞争问题

8.使用线程同步解决

9.互斥锁

10.死锁

11.死锁哲学家问题

结语


一、文件查找

1.按照名字查找

find 查找目录 -name 文件名字

2.通配符

*匹配多个字符

?匹配单个字符

3.文件大小查找

find 文件目录 -size [+,-]长度

查找当前目录以及子目录下大于4K的文件

find . -size +4k

查找当前目录以及子目录下小于4K的文件

find . -size -4k

二、压缩和打包

1.zip

zip

unzip

2.gzip

gzip使用

解压

gzip -d

3.tar命令

常用

打包

tar cvf

压缩

所以说压缩一个文件分两步,先打包,后压缩

tar命令也可以一步到位

tar zcvf

相应的解包也可以一步到位

tar xcvf

或者tart xvf先解压,-C执行解压到的目录


三、权限管理

rwx-rwx-rwx


四、多进程

1.创建进程

import multiprocessing
import time

def task1():
    for i in range(10):
        print('A -- ',i + 1)
        time.sleep(1)

def task2():
    for i in range(10):
        print('B -- ',i + 1)
        time.sleep(1)

if __name__ == '__main__':
    p1 = multiprocessing.Process(target=task1)
    p2 = multiprocessing.Process(target=task2)

    p1.start()
    p2.start()

2.获取进程id

获取进程ID和进程的父ID,进程名

这两个进程都是同一个父进程拉起来的


import multiprocessing
import time
import os

def task1():
    mp = multiprocessing.current_process()
    print("task1:  ", mp)
    print(f"任务1的PID:{os.getpid()} 父进程的PID是{os.getppid()}")
    time.sleep(1)

def task2():
    mp = multiprocessing.current_process()
    print("task2:  ", mp)
    print(f"任务2的PID:{os.getpid()} 父进程的PID是{os.getppid()}")
    time.sleep(1)

if __name__ == '__main__':
    print(f"主进程的PID:{os.getpid()} 父进程的PID是{os.getppid()}")
    #获取当前进程对象
    mp = multiprocessing.current_process()
    print("main:  ",mp)

    p1 = multiprocessing.Process(target=task1,name='p1')
    p2 = multiprocessing.Process(target=task2,name='p2')

    print(p1)
    print(p2)

    p1.start()
    p2.start()

    print(p1)
    print(p2)

3.进程传参

必须要传入可迭代参数

import multiprocessing
import time

def task(count):
    for i in range(count):
        print("任务执行中。。。")
        time.sleep(0.2)
    else:
        print("任务执行完成")

if __name__ == '__main__':
    #因为参数
    sub_process = multiprocessing.Process(target=task,args=5)
    sub_process.start()

import multiprocessing
import time

def task(count):
    for i in range(count):
        print("任务执行中。。。")
        time.sleep(0.2)
    else:
        print("任务执行完成")

if __name__ == '__main__':
    sub_process = multiprocessing.Process(target=task,kwargs={"count": 4})
    sub_process.start()

字典必须要要与参数名相同

import multiprocessing
import time

def task(count):
    for i in range(count):
        print("任务执行中。。。")
        time.sleep(0.2)
    else:
        print("任务执行完成")

if __name__ == '__main__':
    #因为参数
    sub_process = multiprocessing.Process(target=task,kwargs={'a':2})
    sub_process.start()

4.进程不共享全局变量

import multiprocessing
import time

g_list = list()

def add_data():
    for i in range(6):
        g_list.append(i)
        print("add: ",i)
        time.sleep(0.2)

    print("add_data: ",g_list)

def read_data():
    print("read_data",g_list)


if __name__ == '__main__':
    # 创建添加数据的子进程
    add_data_process = multiprocessing.Process(target=add_data)

    # 创建读取数据的子进程
    read_data_process = multiprocessing.Process(target=read_data)

    #启动子进程执行对应的任务
    add_data_process.start()
    #阻塞函数,add_data_process执行完才会继续向下执行
    add_data_process.join()
    
    #全局变量不共享
    read_data_process.start()

5.守护进程

5.1.方式1

import multiprocessing
import time

g_list = list()

def add_data():
    for i in range(6):
        g_list.append(i)
        print("add: ",i)
        time.sleep(0.2)

    print("add_data: ",g_list)

def read_data():
    print("read_data",g_list)


if __name__ == '__main__':
    # 创建添加数据的子进程
    add_data_process = multiprocessing.Process(target=add_data)

    # 创建读取数据的子进程
    read_data_process = multiprocessing.Process(target=read_data)

    #启动子进程执行对应的任务
    add_data_process.start()
    #阻塞函数,add_data_process执行完才会继续向下执行
    add_data_process.join()
    
    #主进程结束之前,手动调用方法结束子进程    
    add_data_process.terminate()
    print("add_data terminate")

    #全局变量不共享
    read_data_process.start()

5.2.方式2


import multiprocessing
import time

g_list = list()

def add_data():
    for i in range(6):
        g_list.append(i)
        print("add: ",i)
        time.sleep(0.2)

    print("add_data: ",g_list)

def read_data():
    print("read_data",g_list)


if __name__ == '__main__':
    # 创建添加数据的子进程
    add_data_process = multiprocessing.Process(target=add_data)

    # 创建读取数据的子进程
    read_data_process = multiprocessing.Process(target=read_data)

    #锁
    add_data_process.daemon = True

    #启动子进程执行对应的任务
    add_data_process.start()
    #阻塞函数,add_data_process执行完才会继续向下执行
    add_data_process.join()


    #全局变量不共享
    read_data_process.start()


五、线程

1.线程创建


import threading
import time

def task1():
    t = threading.currentThread()
    print("task1: ",t)
    for i in range(5):
        print(" Task A ", i+1)
        time.sleep(0.5)

def task2():
    t = threading.currentThread()
    print("task2: ",t)
    for i in range(5):
        print(" Task B ", i+1)
        time.sleep(0.5)

#创建线程
if __name__ == '__main__':
    t1 = threading.Thread(target=task1,name='t1')
    t2 = threading.Thread(target=task2,name='t2')

    print(t1)
    print(t2)
    #创建好线程后,线程并不会被执行
    #必须启动线程
    t1.start()
    t2.start()

    print(t1)
    print(t2)

    print("Main Thread")

2.线程执行带有参数的任务

import threading
import time

def task(count):
    for i in range(count):
        print("任务执行中。。。")
        time.sleep(0.2)
    else:
        print("任务执行完成")

def task1(content , count):
    for i in range(count):
        print(content,'--',i+1)
        time.sleep(0.5)


if __name__ == '__main__':
    sub_thread = threading.Thread(target=task,args=(5,))
    sub_thread2 = threading.Thread(target=task1,args=('Python',5))


    sub_thread.start()
    sub_thread2.start()

3.线程的无序性

import threading
import time
def task():
    t = threading.current_thread()
    for i in range(10):
        print(t.name)
        time.sleep(0.5)

if __name__ == '__main__':
    for i in range(5):
        t = threading.Thread(target=task)
        t.start()

4.守护主线程

没有守护线程,主线程会随即执行

import threading
import time

def task():
    t = threading.current_thread()
    for i in range(5):
        print(t.name)
        time.sleep(0.5)

if __name__ == '__main__':
    t1 = threading.Thread(target=task,name='t1')
    t2 = threading.Thread(target=task,name='t2')

    t1.start()
    t2.start()

    print("main over")

 

方法1

这个方法主线程不等待子线程所以会出现问题


import threading
import time

def task():
    t = threading.current_thread()
    for i in range(5):
        print(t.name)
        time.sleep(0.5)

if __name__ == '__main__':
    t1 = threading.Thread(target=task,name='t1',daemon=True)
    t2 = threading.Thread(target=task,name='t2',daemon=True)

    t1.start()
    t2.start()

    print("main over")

方法2

import threading
import time

def task():
    t = threading.current_thread()
    for i in range(5):
        print(t.name)
        time.sleep(0.5)

if __name__ == '__main__':
    t1 = threading.Thread(target=task,name='t1')
    t2 = threading.Thread(target=task,name='t2')

    t1.setDaemon(True)
    t2.setDaemon(True)

    t1.start()
    t2.start()

    print("main over")

5.阻塞线程

import threading
import time

def task():
    t = threading.current_thread()
    for i in range(5):
        print(t.name)
        time.sleep(0.5)

if __name__ == '__main__':
    t1 = threading.Thread(target=task,name='t1')
    t2 = threading.Thread(target=task,name='t2')

    t1.setDaemon(True)
    t2.setDaemon(True)

    t1.start()
    t2.start()
    t1.join()
    t2.join()

    print("main over")

6.线程间共享全局变量

import threading
import time

c_list = []

def add_data():
    for i in range(5):
        c_list.append(i)
        print(c_list)
        time.sleep(0.5)

def read_data():
    print("read: ",c_list)

if __name__ == '__main__':
    add_t = threading.Thread(target=add_data)
    read_t = threading.Thread(target=read_data)


    add_t.start()
    read_t.start()

7.多线程中共享变量的资源竞争问题

import threading
import time

g_num = 0

def sum_num1():
    for i in range(1000000000):
        global g_num
        g_num += 1

    print("sum1:  ",g_num)




if __name__ == '__main__':

    f_t = threading.Thread(target=sum_num1)
    f_t2 = threading.Thread(target=sum_num1)

    f_t.start()
    f_t2.start()

    time.sleep(3)
    print("main",g_num)

转存失败重新上传取消

时间片轮转的问题

8.使用线程同步解决

线程等待(阻塞)

import threading
import time

g_num = 0

def sum_num1():
    for i in range(1000000000):
        global g_num
        g_num += 1

    print("sum1:  ",g_num)




if __name__ == '__main__':

    f_t = threading.Thread(target=sum_num1)
    f_t2 = threading.Thread(target=sum_num1)

    f_t.start()
    #阻塞
    f_t.join()
    
    f_t2.start()
    f_t2.join()

    time.sleep(3)
    print("main",g_num)

 转存失败重新上传取消

9.互斥锁

上锁

原子操作

解锁

import threading
import time

#创建一个实例锁
metax_lock = threading.Lock()

g_num = 0

def sum_num1():
    t = threading.current_thread()
    for i in range(1000000000):
        metax_lock.acquire()
        global g_num
        g_num += 1
        print(t.name,"=------=",g_num)
        metax_lock.release()


    print("sum1:  ",g_num)




if __name__ == '__main__':

    f_t = threading.Thread(target=sum_num1)
    f_t2 = threading.Thread(target=sum_num1)

    f_t.start()
    f_t2.start()

    time.sleep(3)
    print("main",g_num)







注意不要变成同步锁,一般都是异步执行

10.死锁

这个函数就有个死锁

import multiprocessing
import threading
import time

c_list = [1,2,3,4325]

lock = threading.Lock()
def get_value(index):
    #锁
    lock.acquire()
    t = threading.current_thread()

    if index >= len(c_list):
        print(f'{index} 下界太大,导致下标越界')
        return 
    print(t.name,"取得第",index,'个值,值为',c_list[index])

    lock.release()


if __name__ == '__main__':
    for i in range(5):
        t = threading.Thread(target=get_value,args=(i,))
        t.start()





我们解决掉他

import multiprocessing
import threading
import time

c_list = [1,2,3,4325]

lock = threading.Lock()
def get_value(index):
    #锁
    lock.acquire()
    t = threading.current_thread()

    if index >= len(c_list):
        print(f'{index} 下界太大,导致下标越界')
        lock.release()
        return
    print(t.name,"取得第",index,'个值,值为',c_list[index])

    lock.release()


if __name__ == '__main__':
    for i in range(5):
        t = threading.Thread(target=get_value,args=(i,))
        t.start()

但这里其实还有问题,我们后面讨论

11.死锁哲学家问题

import multiprocessing
import threading
import time

lock_a = threading.Lock()
lock_b = threading.Lock()

def PersonA():
    for i in range(100):
        lock_a.acquire()
        print("A抢到第一个筷子,加一个锁")
        lock_b.acquire()
        print("A加第二个锁,强盗第二根筷子,吃一口饭")
        lock_b.release()
        print("A释放锁,放下第二根筷子")
        lock_a.release()
        print("A加第一个锁,抢到第一根筷子")

def PersonB():
    for i in range(100):
        lock_a.acquire()
        print("B抢到第一个筷子,加一个锁")
        lock_b.acquire()
        print("B加第二个锁,强盗第二根筷子,吃一口饭")
        lock_b.release()
        print("B释放锁,放下第二根筷子")
        lock_a.release()
        print("B加第一个锁,抢到第一根筷子")

if __name__ == '__main__':
    pa = threading.Thread(target=PersonA)
    pb = threading.Thread(target=PersonB)

    pa.start()
    pb.start()




结语

python的部分快要结束了,后面要更新linux服务器和k8s的笔记,希望大家多多👍

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

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

相关文章

系统重构实施,百亿级核心交易如何保证准确性?

重构:又喜欢又害怕 一个企业级的应用,即使是诸葛亮级别的设计人员,最初的考虑都不可能尽善尽美,会存在设计不够或者设计过头的情况。加上业务的发展可能与当初的推想不一致,这样就使得上线初期稳稳当当的一个系统&…

【MySQL】数据库中这么多数据类型你真的了解吗?一文看懂不同数据类型有何区别

【MySQL】数据类型 一、常见数据类型二、数值类型2.1 整型2.1.1 小结 2.2 bit类型2.3 float 类型2.4 decimal类型---精度更高 三、字符串类型3.1 char---固定字符串3.2 varchar---变长字符串3.2.1 char和varchar区别 3.3 日期和时间类型3.4 enum和set3.4.1 set查询----find_in_…

入门编程其实也简单

随着信息技术的快速发展,编程已经成为一个越来越重要的技能。那么,我们该如何入门编程呢? 编程是指使用计算机语言编写计算机程序的过程。计算机程序是一系列指令的集合,这些指令告诉计算机要执行的操作。编程的目的是创建计算机…

2023-6-13-第四式建造者模式

🍿*★,*:.☆( ̄▽ ̄)/$:*.★* 🍿 💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥 💟💟喜欢的朋友可以关注一下&#xf…

Openharmony使用hdc提效

告别串口卡顿调试🐸hdc增效大法🐸,工作环境主要是Linux,所以主要是介绍Linux环境下使用喔~ 文章目录 HDC1.1 简单介绍1.2 搭建环境1.2.1 设备机1.2.2 pc机1.2.3 操作 AuthorDateVersionDescription陈梓归2023-06-13V1.0第一个版本…

详解模板模式

目录 1.概述 2.实际业务场景示例 2.1.需求和实现思路 2.1.完整代码实现 1.概述 模板模式是一种常用的设计模式,它定义了一个操作中的算法的骨架,将某些步骤延迟到子类中实现。模板模式使得子类可以在不改变算法结构的情况下重新定义算法中的某些步骤…

【ubuntu】vscode上jupter notebook的使用

1.安装vscode 2.安装python环境和插件 系统要有Python环境:conda install python 或者 pip都可以 在vsode里安装如下插件 3.安装jupter conda install jupyter notebook 安装完之后试着打开 输入jupyter note 打开才行,如果安装失败,就…

【IoT】降低硬件创业风险的 6 个小建议

目录 第一个是聘用多名独立的工程师 第二个是从小批量开始做 第三个是使用电子模块 第四个是充分利用制造商资源 第五个是在构建产品之前先建立客户群体 第六个是预售你的产品 无论你提前做了多么充分的准备。 将全新的硬件产品推向市场就一定会引入风险。 这里的全新是…

AntDB 企业增强特性介绍——读写分离

面对日益增加的系统访问量,读写分离可以充分利用备机资源,有效地提升数据库的吞吐量。过去常用的手段是通过应用层来控制数据库的读写流量。 AntDB 通过在 Coordinator 组件的 SQL 解析路由层增加对读写流量的精确访问控制且对应用透明,做到…

CMU-Multimodal SDK Version 1.2.0(mmsdk)Windows配置与使用+pytorch代码demo

最近做实验要用到CMU-MOSI数据集,网上搜到的教程很少,经过一天时间的探索,最终成功安装配置数据集,这篇文章完整地整理一下该数据集的下载与使用方法。 配置环境: window10,anaconda 1. 需要下载的内容 …

DVWA-15.Open HTTP Redirect

OWASP将其定义为: 当 Web 应用程序接受不受信任的输入时,可能会导致 Web 应用程序将请求重定向到不受信任输入中包含的 URL,则可能会出现未经验证的重定向和转发。通过修改恶意站点的不受信任的 URL 输入,攻击者可以成功发起网络钓…

NeRF 模型评价指标PSNR,MS-SSIM, LPIPS 详解和python实现

PSNR: PSNR(Peak Signal-to-Noise Ratio,峰值信噪比)是一种常用于衡量图像或视频质量的指标。它用于比较原始图像与经过处理或压缩后的图像之间的差异。PSNR通过计算原始图像与重建图像之间的均方误差(Mean Squared E…

python爬各平台评论并数据分析——数据采集、评论情绪分析、新闻热度

一、爬取数据 小问题汇总 1.python之matplotlib使用系统字体 用于解决python绘图中,中文字体显示问题 2.cookie与视频页面id(b站、微博等)查看 F12打开网页开发者模式,然后F5刷新,进入控制台中的网络,…

618什么值得囤?这些刚需数码好物必囤!

​目前,618活动已经正式拉开帷幕了,相信很多小伙伴已经按耐不住想要入手了!但如果目前还没什么头绪,不知道买什么的话,现在就不妨来抄一下作业吧!近期我整理了一份618数码好物清单,都是精心挑选…

插件化工程R文件瘦身技术方案 | 京东云技术团队

随着业务的发展及版本迭代,客户端工程中不断增加新的业务逻辑、引入新的资源,随之而来的问题就是安装包体积变大,前期各个业务模块通过无用资源删减、大图压缩或转上云、AB实验业务逻辑下线或其他手段在降低包体积上取得了一定的成果。 在瘦…

Window域控环境之账号误删恢复

文章目录 背景信息问题分析操作步骤 文章内容已做脱敏处理 背景信息 8:30,收到联络反馈客户误删除部门领导域控账户,希望紧急实施VM整机恢复工作。收到联络时,我是觉得这个事情挺严重的。毕竟现在域控账号是企业里面重要的身份与…

深度学习数据处理中,标量、向量、张量的区别与联系

计算机中的标量机是指只是一个数一个数地进行计算的加工处理方法,区别于向量机能够对一批数据同时进行加工处理。标量机比向量机的运算速度慢,因此,向量机更适合于演算数据量多的大型科学、工程计算问题。 计算机可以进行数值计算&#xff0c…

5.2.11 IP分组的转发(二)IP分组转发算法

5.2.11 IP分组的转发(二)IP分组转发算法 我们前面已经了解了路由器的结构以及直接交付和间接交付的概念,明白了路由器会根据路由协议生成路由表再根据路由表生成转发表,当路由器收到一个待转发的IP分组以后,会根据分组…

Background-1 基础知识 sqli-Labs Less1-Less-4

文章目录 一、Less-1二、Less-2三、Less-3四、Less-4总结 一、Less-1 http://sqli:8080/Less-1/?id1在第一关我们可以尝试增加一个单引号进行尝试 http://sqli:8080/Less-1/?id1错误显示如下: near 1 LIMIT 0,1 at line 1推测语法的结构 select *from where **…

2009年iMac装64位windows7

单位领导会花屏的iMac(24寸 2009年初版)我捡来用,应该大约是在2020年安装了32位windows7,发现不安装显卡驱动便不会花屏死机,于是就当简单的上网机用着,毕竟iMac的显示屏还是蛮不错的。现在要使用的1个软件…