zoukankan      html  css  js  c++  java
  • python中线程和进程的简单了解

    python中线程和进程的简单了解

     

    一、操作系统、应用程序

      1.硬件:硬盘、cpu、主板、显卡........

      2.装系统(本身也是一个软件):

        系统就是一个由程序员写出来的软件,该软件用于控制计算机得硬盘,让他们之间进行互相配合。

      3.安装软件:各种应用程序

    二、并发和并行

      并发:伪,由于执行速度特别快,人感觉不到停顿

      并行:真,创建多个对象同时操作

    三、线程、进程

      1.单进程、单线程的应用程序

        print("asd")

      2.到底什么是线程、进程

        python中没有这两个,是python调用的操作系统的线程和进程

      3.单进程、多线程的应用程序

    复制代码
    import threading    #两个进程
    print("start")
    def func(arg):
        print(arg)
    t = threading.Thread(target=func,args=("......",))
    t.start()
    print("end")
    # start
    # ......
    # end
     
    复制代码
    import threading
    class MyThread(threading.Thread):
        def run(self):
           print(11111,self._args,self._kwargs)    #********
    t1 = MyThread(args=(11,))
    t1.start()
    print("end")
    # 11111 (11,) {}
    # end
    复制代码

    python多线程情况下:

      计算密集型操作:效率低(GIL锁)

      IO操作:效率高

    python多进程的情况下:

      计算密集型:效率高(浪费资源)

      IO操作:效率高(浪费资源)

    在使用时:

      IO密集型用多线程:文件、输入、输出、socket网络通信

      计算密集型用多进程

    四、python中线程和进程(GIL锁)

      GIL锁,全局解释器锁,用于限制一个进程中同一时刻只有一个线程被cpu调度。

      扩展:默认GIL锁在执行100个cup指令(过期时间)

    setDaemon(True) 若为Ture 则会直接运行主线程,不用等待
     1 import  threading
     2 import time
     3 def func(a):
     4     time.sleep(2)
     5 
     6     print(a)
     7 s1=threading.Thread(target=func,args=(1,))
     8 s1.setDaemon(True)
     9 s1.start()
    10 s2=threading.Thread(target=func,args=(2,))
    11 s2.setDaemon(False)#只要两个
    12 s2.start()

    join的使用 

     join是限制主线程等待子线程的时间,等够了就不再等子线程执行结束,主线程接着执行,没等够主线程就会停下等待,并不是时间到了程序停止的意思 
     1 import time#让主线程等待
     2 import  threading
     3 def func(a):
     4     time.sleep(2)
     5     print(a)
     6 print("创建t1")
     7 t1=threading.Thread(target=func,args=(1,))
     8 
     9 t1.start()
    10 t1.join(1)
    11 print("创建t2")
    12 t2=threading.Thread(target=func,args=(2,))
    13 
    14 t2.start()
    15 t2.join(1)
    16 print(123)

    获取名字

    1 import threading#或取名字
    2 def func(arg):
    3     t=threading.current_thread()#创建对象
    4     name=t.getName()#直接查找名字哦
    5     print(name,arg)
    6 t1=threading.Thread(target=func,args=(1,))
    7 t1.setName("张庆")
    8 t1.start()
    9 print(123)

    加锁:

     1 import  threading
     2 import  time
     3 lock = threading.RLock()
     4 
     5 n = 10
     6 
     7 def task(i):
     8     print('这段代码不加锁',i)
     9 
    10     lock.acquire() # 加锁,此区域的代码同一时刻只能有一个线程执行
    11     #这题区域分为加锁前和后 先按顺序执行加锁前面的代码,一旦发现加锁
    12     #就直接执行这一个线程的代码>>>执行prient
    13     #执行后执行加锁后面的代码,需要解锁 才可以实现
    14     #解锁后也是根据这一课一线程的代码一步一步解锁
    15     #
    16     global n
    17     print('当前线程',i,'读取到的n值为:',n)
    18     n = i
    19     time.sleep(1)
    20     print('当前线程',i,'修改n值为:',n)
    21     lock.release(),
    22 
    23 for i in range(10):
    24     t = threading.Thread(target=task,args=(i,))
    25     t.start()
  • 相关阅读:
    CSS——实现图像远距离翻转效果
    《精通CSS》一个下拉菜单的例子
    将博客搬至CSDN
    44个Java代码性能优化总结
    QRCode 二维码生成
    Linux命令
    spring
    ajax 学习总结
    Servlet+Ajax实现搜索框智能提示代码
    搜索框智能提示
  • 原文地址:https://www.cnblogs.com/zhangqing979797/p/9622551.html
Copyright © 2011-2022 走看看