• 线程理论及开启线程的两种方式


    manage 创建共享内容
    生产者消费者模型使用场景
    多道技术(不太清楚)
    生产者消费者模型可以应用于多台机器上 分布式 可以多台计算器放着生产者,坏了几台也不影响,稳定。
    如果有多个生产者消费者那么队列就要基于网络,应该做成套接字。
    放在main下面导入问题——》开启子进程涉及到一个导入模块的问题,不放在main下start开启子进程导入时会把自己又执行一次,造成重复导入。

    今日内容:
    进程不是执行单位为什么可以执行代码?因为是里面的线程在执行

    cpu切换切的是线程
    1.什么是线程?为何有线程?怎么用线程?
    线程指的是一条流水线的工作流程
    进程不是一个执行单位是一个资源单位。
    一个进程内自带一个线程,线程是执行单位。
    qq进程:qq资源相关的数据占了一个独立的空间。(申请一个内存空间,中间产生的数据往里放)
    每个进程内自带一个线程,线程才是cpu的执行单位
    进程在运行本质是进程里的线程在执行
    一个文件的执行:先开辟一个空间,生成的数据往里面丢
    线程的执行:空间已经由进程造好了,直接运行就行了
    线程是一个抽象的概念。(三个线程就是有三段代码在运行,三个进程就是有三个内存空间建立)
    2.开启线程的两种方式 (*****)
    开线程不需要写到main下,但是为了规范还是要写main。


    3 线程vs进程 (*****)
    同一进程内的线程们共享该进程内的资源,不同进程内的线程资源肯定是隔离的。
    创建线程的开销比创建进程要小得多。
    1、 线程中没有父子关系。相较于子线程、主线程特殊之处在于其代变了主进程的生命周期。
    主进程等待子进程结束然后结束,是为子进程回收资源。
    主线程等待子线程结束然后结束,是等待这个进程的代码(其他非守护线程)执行完毕。 
    方式一:导入Thread模块
    from threading import Thread
    import time
    
    def task(name):
        print('%s is running' %name)
        time.sleep(3)
    
    if __name__ == '__main__':
        t=Thread(target=task,args=('egon',))
        t.start()
    print('主线程')
    
    方式二:创建类继承Thread
    from threading import Thread
    import time
    
    class MyThread(Thread):
        def run(self):
            print('%s is running' %self.name)
            time.sleep(3)
    
    if __name__ == '__main__':
        t=MyThread()
        t.start()
    print('主线程')
    创建线程的两种方式

    1查看线程pid:一个进程中的线程pid是一样的

    1、瞅一瞅PID (Process ID)
    from threading import Thread
    import time,os
    
    def task():
        print('%s is running' %os.getpid())
        time.sleep(3)
    
    if __name__ == '__main__':
        t=Thread(target=task,)
        t.start()
        print('主线程',os.getpid()) #一个进程中的子线程pid相同
    查看线程pid

    2 线程创建开销小:子进程创建不需要向操作系统申请内存空间,直接执行程序。

    3.同一个进程中的多个线程共享进程的资源

    from threading import Thread
    import time,os
    
    x=1000
    def task():
        global x
        x=0
    
    if __name__ == '__main__':
        t=Thread(target=task,)
        t.start()
        t.join()
        print('主线程',x)   #主线程 0
    共享进程内资源

    线程的对象以及属性

    查看当前线程名字(current_thread().name),active_count() 查看当前活跃的线程数 ,获得线程对象 enumerate(),以及查看当前线程的pid

    from threading import Thread,current_thread,active_count,enumerate
    import time,os
    
    def task():
        print('%s is running' %current_thread().name)  #Thread-1 is running
        time.sleep(3)
        print("%s is done"%os.getpid())
    
    if __name__ == '__main__':
        t1=Thread(target=task,name='第一个线程')
        t2=Thread(target=task,)
        t3=Thread(target=task,)
        t1.start()
        t2.start()
        t3.start()
        print(t1.is_alive())  #True
        print(active_count()) #4
        print(enumerate())
    线程名,活跃线程数,线程对象返回






  • 相关阅读:
    CSS 选择器及各样式引用方式
    The usage of docker image wurstmeister/kafka
    kafka connect rest api
    Kafka connect in practice(3): distributed mode mysql binlog ->kafka->hive
    jail-break-rule
    Ubuntu下把缺省的dash shell修改为bash shell
    mysql 5.7 enable binlog
    Docker CMD in detail
    记一次深度系统安装至windows系统盘提示挂载为只读模式问题
    android 监听声音变化
  • 原文地址:https://www.cnblogs.com/Roc-Atlantis/p/9305029.html
Copyright © 2020-2023  润新知