python高级-线程和进程相关

这里前面的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的笔记,希望大家多多👍

  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

白帽小丑

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值