• day 38 线程和进程的比较,开启线程的方式,线程的创建的速度,线程的join和其他相关方法,守护线程


    线程和进程的比较

    线程:cpu最小的执行单位

    进程:资源集合/资源单位.

    线程运行 = 运行代码

    进程运行 = 各种资源 + 线程

    右键运行:
    申请内存空间,先把解释器丢进去并且把代码丢进去(进程做的),运行代码(线程).

    进程和线程的区别:

    线程==》单指代码的执行过程
    进程==》资源的申请与销毁的过程

    进程内存空间彼此隔离
    同一个进程下的线程共享资源.

    进程需要申请资源开辟空间 慢
    只是告诉操作系统一个执行方案 快


    开启线程的两种方式
    #第一种方式:
    from threading import Thread
    import time
    def task():
    print('线程 start')
    time.sleep(2)
    print('线程 end')

    t = Thread(target=task)
    t.start() # 告诉操作系统开一个线程 .

    print('主')

    #第二种方式:
    from threading import Thread
    import time
    # 进程等待所有线程结束才会结束

    class Myt(Thread):
    def run(self):
    print('子线程 start')
    time.sleep(5)
    print('子线程 end')

    t = Myt()
    t.start()
    print('主线程')



    子线程和子进程创建速度
    from threading import Thread
    from multiprocessing import Process
    import time

    def task(name):
    print(f'{name} is running')
    time.sleep(2)
    print(f'{name} is end')


    if __name__ == '__main__':
    t = Thread(target=task,args=('子线程',))
    p = Process(target=task,args=('子进程',))
    # t.start()
    p.start()
    print('主')

    '''
    开启子线程的打印效果:

    子线程 is running

    子线程 is end

    开启子进程打印效果:


    子进程 is running
    子进程 is end


    进程和线程的创建速度
    开启子进程需要申请资源开辟空间 慢
    开启子线程只是告诉操作系统一个执行方案 快

    '''

    子线程共享进程资源
    from threading  import Thread
    import time,os

    x = 100
    def task():
    global x
    x = 50
    print(os.getpid()) # 5204


    if __name__ == '__main__':

    t = Thread(target=task)
    t.start()
    time.sleep(2)
    print(x) # 50
    print(os.getpid()) # 5204


    线程的join方法
    from threading import Thread
    import time
    def task():
    print('子线程 start')
    time.sleep(2)
    print('子线程 end')

    t = Thread(target=task)
    t.start()
    t.join() # 等待子线程运行结束
    print('主线程')



    from threading import Thread
    import time
    def task(name,n):
    print(f'{name} start')
    time.sleep(n)
    print(f'{name} end')

    t1 = Thread(target=task,args=('线程1',1))
    t2 = Thread(target=task,args=('线程2',2))
    t3 = Thread(target=task,args=('线程3',3))
    start = time.time()
    t1.start()
    t2.start()
    t3.start()
    t1.join() # 111s
    t2.join() #
    t3.join()
    end = time.time() # 3.0039877891540527
    # 思考一下 在单核的情况下 多个线程是如何利用cpu的
    print(end-start)
    # print('主线程')


    from multiprocessing import Process
    from threading import Thread
    import time
    def task():
    print('进程 开启')
    time.sleep(10)
    print('进程 结束')
    def task2():
    print('子线程 开启')
    time.sleep(2)
    print('子线程 结束')

    if __name__ == '__main__':
    p = Process(target=task)
    t = Thread(target=task2)
    t.start() # 开线程
    p.start() # 开进程
    print('子进程join开始')
    p.join() # 主进程的主线程等待子进程运行结束
    print('主')




    线程的其他相关用法
    from threading import Thread,currentThread,enumerate,activeCount
    # import threading
    import time
    # threading.current_thread()
    # threading.current_thread()

    def task():
    print('子线程 start')
    time.sleep(2)
    print('子线程 end')
    print(enumerate())
    # print(currentThread(),'子线程')
    if __name__ == '__main__':
    t1 = Thread(target=task)
    t2 = Thread(target=task)
    t1.start()
    t2.start()



    # print(t1.is_alive()) # True
    # print(t1.getName()) # Thread-1
    # print(t2.getName()) # Thread-2
    # t1.setName('班长')
    # print(t1.getName())
    # print(currentThread().name)
    # print(enumerate()) # [<_MainThread(MainThread, started 1856)>, <Thread(Thread-1, started 6948)>, <Thread(Thread-2, started 3128)>]
    # print(activeCount()) # 3
    # print(len(enumerate())) # 3



    守护线程
    # 守护线程 等其他进程结束了 才结束
    主线程在其他非守护线程运行完毕后才算运行完毕(守护线程在此时就被回收)。因为主线程的结束意味着进程的结束,进程整体的资源都将被回收,而进程必须保证非守护线程都运行完毕后才能结束。
    from threading import Thread,enumerate,currentThread
    import time

    def task():
    print('守护线程开始')
    print(currentThread())
    time.sleep(20)
    # print('守护线程结束')

    def task2():
    print('子线程 start')
    time.sleep(5)
    print(enumerate())
    print('子线程 end')

    if __name__ == '__main__':
    t1 = Thread(target=task)
    t2 = Thread(target=task2)
    t1.daemon = True
    t2.start()
    t1.start()
    print('主')
























     












  • 相关阅读:
    Packet for query is too large (1986748 > 1048576). You can change this value on the server by 异常
    解决springdatajpa插入大量数据速度慢的问题
    thymeleaf onclick方法向js方法传递参数
    git的使用(扫盲)
    【错误总结】Component template should contain exactly one root element. If you are using v-if on multiple elements, use v-else-if to chain them instead.
    SpringBoot集成Swagger(Swagger的使用),生成接口文档,方便前后端分离开发
    spring中后台接收参数总结
    PTA 03-树3 Tree Traversals Again (25分)
    PTA 03-树2 List Leaves (25分)
    PTA 03-树1 树的同构 (25分)
  • 原文地址:https://www.cnblogs.com/wwei4332/p/11534163.html
Copyright © 2020-2023  润新知