• python_并发编程——多线程1


    1.多线程并发

    from threading import Thread
    import time
    
    def func(n):
        time.sleep(1)
        print(n)
    
    for i in range(10):
        t = Thread(target=func,args=(i,))   #将函数注册进子线程,并传递参数
        t.start()   #启动子线程

    结果:

     2.另外一种启动多线程的方法

    from threading import Thread
    import time
    
    class MyTread(Thread):
        def __init__(self,arg):     #接收参数
            super().__init__()
            self.arg = arg
    
        def run(self):  #子线程要执行的内容
            time.sleep(1)
            print(self.arg)
    
    for i in range(10):
        t = MyTread(i)  #实例化子线程+传递参数
        t.start()   #启动子线程

    结果:

     3.查看多线程是否都在同一个进程里面

    from threading import Thread
    import time
    import os
    
    class MyTread(Thread):
        def __init__(self,arg):     #接收参数
            super().__init__()
            self.arg = arg
    
        def run(self):  #子线程要执行的内容
            time.sleep(1)
            print(self.arg,os.getpid())
    
    for i in range(10):
        t = MyTread(i)  #实例化子线程+传递参数
        t.start()   #启动子线程
    print('主线程:',os.getpid())

    结果: 相同的进程编号,说明所有的线程都在同一个进程里面。

    4.线程之间数据共享

    from threading import Thread
    import time
    
    ggg = 100
    
    def func(n):
        time.sleep(1)
        global ggg
        ggg = 0
        print('子线程:',n)
    
    
    t_list = []
    for i in range(10):
        t = Thread(target=func,args=(i,))
        t.start()
        t_list.append(t)
    for i in t_list:
        i.join()
    print('主线程:',ggg)

    结果: 全局变量ggg本来是100,在子线程中被改成了0。

    5.查看线程名字和线程ID

    import threading
    
    def func(n):
        print(n)
            #打印线程名字和ID
        print(threading.current_thread())
            #打印线程ID
        print(threading.get_ident())
    
    threading.Thread(target=func,args=(1,)).start()
    print(threading.current_thread())

    结果:

     6.查看当前存活的线程数量和线程对象

    import threading
    import time
    
    def func(n):
        time.sleep(1)
        print(threading.current_thread())
    
    for i in range(10):
        threading.Thread(target=func,args=(i,)).start()
    #查看当前存活的线程数量
    print(threading.active_count())
    #查看当前存活的线程对象
    print(threading.enumerate())

    结果:

    7.守护线程

    import time
    from threading import Thread
    
    def func1():
        time.sleep(10)
        print('子线程!')
    
    t = Thread(target=func1)
    t.start()
    print('主线程!')

    结果:主线程会等待10秒后,子线程结束时在结束。

    import time
    from threading import Thread
    
    def func1():
        time.sleep(10)
        print('子线程!')
    
    t = Thread(target=func1)
    t.daemon = True     #将子线程设为守护线程
    t.start()
    print('主线程!')

    结果:当只有一个守护线程时,主线程结束时,守护线程随即结束。

    import time
    from threading import Thread
    
    def func1():
        while True:
            print('*'*10)
            time.sleep(1)
    def func2():
        time.sleep(5)
        print('func2结束!')
    
    t1 = Thread(target=func1)
    t1.daemon = True     #将子线程设为守护线程
    t1.start()
    t2 = Thread(target=func2)
    t2.start()
    print('主线程!')

    结果:守护线程和守护进程不一样,守护进程随着主进程的代码的执行结束而结束,守护线程会在主线程结束之后等待其他子线程的结束才结束。

     8.join()方法

    import time
    from threading import Thread
    
    def func1():
        while True:
            print('*'*10)
            time.sleep(1)
    def func2():
        time.sleep(5)
        print('func2结束!')
    
    t1 = Thread(target=func1)
    t1.daemon = True     #将子线程设为守护线程
    t1.start()
    t2 = Thread(target=func2)
    t2.start()
    t2.join()   #先阻塞主线程,专注于执行子线程,等子线程执行完毕后,在执行主线程
    print('主线程!')

    结果:

  • 相关阅读:
    【C++】《C++ Primer 》第二章
    【剑指Offer】链表的基本操作之创建、插入、删除
    【LeetCode】365.水壶问题
    【Flutter】事件处理与通知之原始指针事件处理
    【Flutter】功能型组件之对话框详解
    【Flutter】功能型组件之异步UI更新
    mongdb_基本操作
    startswith在项目中的应用
    subString在项目中的应用
    comtains在项目中的应用
  • 原文地址:https://www.cnblogs.com/wangdianchao/p/12109579.html
Copyright © 2020-2023  润新知