pyhton - 进程与线程

进程

Process类

def task(a):
    for i in range(4):
        print(a)
def task1(a):
    for i in range(4):
        print(a)
if __name__ == '__main__':
    p = Process(target=task, args=("小名", ))  # 创建进程
    p.start()  # 启动进程
    p1 = Process(target=task, args=("小红", ))
    p1.start()

自定义进程

建一个类,继承Process,重写run方法

class MyProcess(Process):
    def __init__(self, name):
        super(MyProcess, self).__init__()
        self.name = name

    def run(self):
        for i in range(4):
            time.sleep(0.5)
            print(self.name)


if __name__ == "__main__":
    a = MyProcess("小红")
    b = MyProcess("小名")
    a.start()
    b.start()

进程池

p = Pool(5)
"""
阻塞式: apply(fun, args=(1,), kwds=")
非阻塞式:apply_async(fun, args=(1,), kwds="", callback=)
"""
def task(task_name):
    print("开始任务:", task_name)
    start = time.time()
    time.sleep(random() * 2)
    end = time.time()
    return "任务完成! 用时:{}".format(end - start), "进程id:{}".format(os.getpid())
container = []
def call_back(n):
    container.append(n)
if __name__ == '__main__':
    pool = Pool(5)
    tasks = ['听音乐', '吃饭', '睡觉', '打豆豆', '玩游戏', '生孩子', '跳舞']
    for task1 in tasks:
        pool.apply_async(task, args=(task1,), callback=call_back)
    pool.close()
    pool.join()  #插队,排在主线程前面
    for i in container:
        print(i)
    print("进程结束")

线程

进程里面包含多个线程,线程共用进程资源

def task1(a)
    for i in range(4):
        print("aaa",a)
def task2(a)
    for i in range(4):
        print("bbb",a)
def task3(a)
    for i in range(4):
        print("ccc",a)
        
if __name__ == "__main__":
    t1 = threading.Thread(target=task1, name="线程1", args=(1, ))
    t2 = threading.Thread(target=task2, name="线程2", args=(2, ))
    t3 = threading.Thread(target=task3, name="线程3", args=(3, ))
    t1.start()
    t2.start()
    t3.start()

自定义线程

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

    def run(self):
        print("自定义线程", self.name)


if __name__ == '__main__':
    t1 = MyThreading("线程")
    t1.start()

共享数据

  进程共享数据与线程共享数据的区别:

    进程是每个进程都有一份

    线程是共同一个数据 -》 数据安全

  GIL -》 伪线程 ,pyhton创建线程后会自动解锁,需要手动加锁(线程同步)

  用锁时,可能会导致 死锁,如何避免死锁:可以在 acuqire()中加 timeout=5,来避免死锁

lock = Threading.Lock()

def task():
    lock.acquire()
    for i in range(10):
        time.sleep(0.5)
        print("aaaa")
    lock.release()

线程间通信:生产者与消费者

生产者: 线程

消费者:线程 

def task(q):
    text = ['aaa', 'bbb', 'ccc', 'ddd']
    for i in text:
        q.put(i)

def tesk1(q):
    while True:
        try:
            text = q.get(timeout=2)
            print(text)
        except:
            print("全部打印成功")
            break

if __name__ == "__main__":
    q = queue.Queue()
    t1 = threading.Thread(target=task, args=(q, ))
    t2 = threading.Thread(target=task, args=(q, ))
    t1.start()
    t2.start()

 

posted @   JiZhaoG  阅读(30)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· AI与.NET技术实操系列(五):向量存储与相似性搜索在 .NET 中的实现
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
点击右上角即可分享
微信分享提示