python—线程(1)

===================================
好久么更新了 今天终于重回大家视野

希望大家在特殊时期尽量不要出门!

武汉必胜!! 中国必胜!!!

===================================
说线程之前先来说说进程池吧

当需要创建的子进程数量不多时,我们可以直接利用multiporcessing中的Process动态生成多个进程,

但是如果现在有100个任务需要处理,那我们需要多少个子进程呢,如果我们创建100个子进程也可以实现,但是资源比较浪费。我们也可以创建指定个数个子进程,

例如
只创建10个子进程,让着10个子进程重复的执行任务,这样就节约了资源。
就比如我们去景区湖上游玩,游船是重复利用的。
我们可以使用multiprocessing模块提供的Pool类,也就是进程池,可以到达进程重复利用。泸沽岛
创建进程池对象的时候可以指定一个大进程数,当有新的请求提交到进程池中,如果池中的进程数还没有满,那么就会创建一个新的进程用来执行该请求,但是如果池中的进程数满了,该请求就会等待,知道进程池中的进程有结束的了,才会使用这个结束的进程来执行新的任务。

join 主进程等待所有子进程执行完毕,必须在close之后。
close 等待所有进程结束才关闭线程池

小练习:下载器

import time
from multiprocessing import Pool
def down_load(movie_name):
    """下载器"""
    for i in range(5):
        print("电影:{},下载进度{}%".format(movie_name,(i/4*100)))
        time.sleep(1)
    return movie_name

def alert(movie_name):
    print("电影:{}下载完成了。。。。".format(movie_name))

if __name__=="__main__":
    movie_list=["钢铁侠","蜘蛛侠","美国队长","死侍","黑豹","黑寡妇"]
    pool = Pool(3) # 创建进程池
    for movie_name in movie_list:
        # 调用进程池
        pool.apply_async(down_load,(movie_name,),callback=alert)
    pool.close()
    pool.join()

结果:

电影:钢铁侠,下载进度0.0%
电影:蜘蛛侠,下载进度0.0%
电影:美国队长,下载进度0.0%
电影:蜘蛛侠,下载进度25.0%
电影:钢铁侠,下载进度25.0%
电影:美国队长,下载进度25.0%
电影:钢铁侠,下载进度50.0%
电影:蜘蛛侠,下载进度50.0%
电影:美国队长,下载进度50.0%
电影:钢铁侠,下载进度75.0%
电影:蜘蛛侠,下载进度75.0%
电影:美国队长,下载进度75.0%
电影:钢铁侠,下载进度100.0%
电影:蜘蛛侠,下载进度100.0%
电影:美国队长,下载进度100.0%
电影:死侍,下载进度0.0%
电影:蜘蛛侠下载完成了。。。。
电影:黑豹,下载进度0.0%
电影:钢铁侠下载完成了。。。。
电影:美国队长下载完成了。。。。
电影:黑寡妇,下载进度0.0%
电影:死侍,下载进度25.0%
电影:黑豹,下载进度25.0%
电影:黑寡妇,下载进度25.0%
电影:死侍,下载进度50.0%
电影:黑豹,下载进度50.0%
电影:黑寡妇,下载进度50.0%
电影:黑豹,下载进度75.0%
电影:死侍,下载进度75.0%
电影:黑寡妇,下载进度75.0%
电影:黑豹,下载进度100.0%
电影:死侍,下载进度100.0%
电影:黑寡妇,下载进度100.0%
电影:黑豹下载完成了。。。。
电影:死侍下载完成了。。。。
电影:黑寡妇下载完成了。。。。

1、 线程概念
由于进程是资源拥有者,创建、撤消与切换存在较大的内存开销,因此需要引入轻型进程即线程,

进程是资源分配的小单位,线程是CPU调度的小单位(程序真正执行的时候调用的是线程).

每一个进程中至少有一个线程

在这里插入图片描述

2.

线程之间共享全局变量

import threading

g_num=100

def work1():
    global g_num
    g_num+=1
    print("work--->",g_num)
def work2():
    print("work2--->",g_num)


def main():
    t1=threading.Thread(target=work1)
    t2=threading.Thread(target=work2)
    t1.start()
    t2.start()

if __name__ == '__main__':
    main()

量的问题

多线程开发的时候共享全局变量会带来资源竞争效果。也就是数据不安全。

import time
import random
from  threading import  Thread
g_num=100
def work1():
    global g_num
    for i in range(3):
        g_num+=1
        time.sleep(random.random())
    print("in work,g_num=%d"%g_num)

def work2():
    global g_num
    # g_num+=1
    for i in range(3):
        g_num+=1
        time.sleep(random.random())
        print("in work2,g_num=%d"%g_num)
if __name__ == '__main__':
    t1=Thread(target=work1)
    t2=Thread(target=work2)
    t1.start()
    t2.start()

今天先到这里 明天见!

发布了37 篇原创文章 · 获赞 49 · 访问量 4063
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章