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()
posted @ 2018-09-10 20:20  逆欢  阅读(155)  评论(0编辑  收藏  举报