zoukankan      html  css  js  c++  java
  • python语法基础-并发编程-线程-线程理论和线程的启动

    #######################       线程介绍         ##############################

    """
    线程介绍
    
    为什么会有进程?
    主要是能够同时处理多个任务,多个任务还要进行切换,时间片轮转
    为什么会有线程?
    进程并不是执行任务的最小单元,每一个进程里面有都一个线程,我们叫做主线程,
    早期没有线程,一个进程只能干一个任务,如果有多个任务,只能多起进程,进程太多不行的,
    进程内部的内存是共享的,所以需要线程,否则还要涉及到进程间的通信,这比较浪费资源
    
    所以线程的出现解决了两个问题:
    1,进程内部的通信
    2,一个进程可以处理多个任务,
    
    线程的开销比进程少,可以认为是一个轻型的进程,
    进程是资源分配的最小单位,线程是cpu调度的最小单位,
    
    进程和线程的区别:
    1,进程之间的内存是独立的,但是一个进程之内的线程是可以共享的,
    2,进程之间切换是慢于线程之间的切换的,
    """

    ##################      线程启动的两种方式       ###############

    """
    在python中使用线程 threading模块 multiprocess模块的完全模仿了threading模块的接口,二者在使用层面,有很大的相似性,因而不再详细介绍 """ # 第一种启动方式: from threading import Thread import time,os def func(n): # 这是子线程完成的 time.sleep(1) # 虽然是打印了10次,但是只等待了1秒,所以10线程之间是并发的, print(n) for i in range(10): # 启动10个线程, t = Thread(target=func,args=(i,)) # 注册 t.start() # 这是启动了一个线程 # 第二种启动线程的方法: # class MyTread(Thread): # def __init__(self,arg): # super().__init__() # self.arg=arg # def run(self): # time.sleep(1) # print(1,os.getpid()) # for i in range(10): # t = MyTread(10) # 传递参数 # t.start() # # print("主线程",os.getpid()) # 打印子进程和主进程的进程号,都是一样的

    Thread类的其他方法

    # Threading中的其他方法
    from threading import Thread
    import time
    def sayhi(name):
        time.sleep(2)
        print('%s say hello' %name)
    if __name__ == '__main__':
        t=Thread(target=sayhi,args=('egon',))
        t.start()
        t.join()
        print('主线程')
        print(t.is_alive())
        '''
        egon say hello
        主线程
        False
        '''
    ###############################################
    import threading
    def func(n):
        print(n, threading.current_thread())  # <Thread(Thread-1, started 5428)>
    for i in range(10):
        threading.Thread(target=func, args=(1,)).start()
    print(threading.active_count())  # 查看活跃的线程数,
    print(threading.current_thread())

    ###############       进程和线程的对比      ##############

    """
    进程和线程的区别?
    
    进程拥有一个完整的虚拟地址空间,不依赖于线程而独立存在;
    反之,线程是进程的一部分,没有自己的地址空间,与进程内的其他线程一起共享分配给该进程的所有资源。
    
    关系问题,资源问题,分工问题,效率问题,数据问题,
    
    第一个结论要记住:进程先有的,然后才有线程,线程是进程的一部分,线程是依赖于进程的,没有进程就没有线程,
    第二个结论要记住:一个进程里面一定有一个主线程,进程是一个资源分配的单位,真正执行代码的时候还是线程,
    第三个结论要记住:进程需要开辟新的资源空间,所以多线程需要很大的资源才可以实现多任务,但是线程只需要很少的资源就可以实现多任务,
    第四个结论要记住:进程之间是数据独立的,所以涉及到进程间的通信问题,但是一个进程的线程之间是资源共享的,
    
    比如:
    一个网易云音乐,开启了之后就是一个进程,
    使用这个网易云音乐既要下载音乐,又要播放音乐,这就是两个线程,
    
    """

    ##################################################

  • 相关阅读:
    为开源项目 go-gin-api 增加后台任务模块
    将多行数据以',' 进行分隔
    syslog中的“(CRON)信息(未安装MTA,丢弃输出)”错误,crontab定时任务失效
    为什么我不推荐大家去外包公司?
    Linux永久修改系统时间
    云数据库 Redis 暂时不支持外网访问
    Nginx中worker connections问题的解决方法 大量用户502
    入手
    nginx 之$proxy_host|$host|$http_host区别
    grpc-golang入门
  • 原文地址:https://www.cnblogs.com/andy0816/p/12375813.html
Copyright © 2011-2022 走看看