进程与线程相关

1.操做系统/应用程序
a.硬件
硬盘,CPU,主板,显卡,内存,电源...
b.软件,应用程序
QQ,pycharm,WPS
c.装系统(系统也是一个软件)
系统就是一个由程序员写出来的软件
2.并发和并行
并发:伪的,只是执行的速度特别快,人感受不到停顿
并行:真的,几个工做同时进行
3.线程,进程


a.单进程,单线程的应用,
print(666)
b.什么是进程,什么是线程.
python本身没有,python中调用的是操做系统中的进程,和线程
  
   c.单进程,多线程的应用程序
import threading
import time
print(666)
def task(arg):
print(arg)
arg=int(input('请输入一个数'))
t=threading.Thread(target=task,args=(arg,))
time.sleep(10)
t.start()
一个应用程序(软件),能够有多个进程(默认只有一个),一个进程中能够有多个线程(默认只有一个)
d.
    之前:

import time list=['思路.png','111.PNG','尚宏运.txt'] for row in list: with open(row,mode='rb') as f: time.sleep(5)  #停顿五秒出来一个,一共停顿三个五秒
        print(f.read())
(1)写好代码
(2)交给解释器取运行
(3)解释器读取代码,交给操做系统去执行,根据代码的内容,建立多少个线程/进程去执行(单进程/单线程)
(4)操做系统调用硬件
    如今
import time import threading list=['思路.png','111.PNG','尚宏运.txt'] def task(arg): with open(arg,mode='rb') as f: time.sleep(5)  #停顿一个五秒后所有都出来
        print(f.read()) for arg in list: t=threading.Thread(target=task,args=(arg,)) t.start()
(1)写好代码
(2)交给解释器去运行
(3)解释器读取代码,交给操做系统去执行 ,根据代码的内容,建立多少个进程/线程去执行(单进程/4线程)
(4)操做系统调用硬件
4. Python中线程和进程(GIL锁)


GIL锁,全局解释器锁,用于控制一个进程同一时刻,只有一个线程被CPU调度
GIL锁的存在限制了,在Python中,一个进程中,最多只能有一个线程工做
扩展:默认GIL锁在执行100个cpu指令。
import sys
v1 = sys.getcheckinterval()#(过时时间)
print(v1) 3执行100个CPU指令,就换另外一个线程
python多线程状况下:
计算密集型操做:效率低
IO操做:效率高
python多进程状况下:
计算密集型操做:效率高 (浪费资源),不得已而为之
IO操做:效率高(浪费资源),更多用多线程解决
结论:之后的用法
IO密集型用多线程
计算密集型用多进程
Java多线程的状况下:
计算密集型操做:效率高
IO操做:效率高
5.Python线程编写
(1)多线程对于计算密集型无用
import time import threading v1=[11,22,33] v2=[111,222,333] def func(data,num): time.sleep(2) for i in range(len(data)): data[i]=data[i]+num t=threading.Thread(target=func,args=(v1,1)) t.start() t1=threading.Thread(target=func,args=(v2,100)) t1.start() time.sleep(6.1) print(v1)#得到结果一共须要6秒左右
print(v2)
(2)多进程对于IO操做有用
import time import threading list=['思路.png','111.PNG','尚宏运.txt'] def task(arg): with open(arg,mode='rb') as f: time.sleep(5)  #停顿一个五秒后所有都出来,而不是15秒
        print(f.read()) for arg in list: t=threading.Thread(target=task,args=(arg,)) t.start()
(3)线程编写具体用法  
  ①线程的基本使用
import threading def func(arg): print(arg) t=threading.Thread(target=func,args=(11,)) t.start() #123
print(123)  #123
  ②主线程默认等子线程执行完毕
import time import threading def func(arg): time.sleep(2) print(arg) t1=threading.Thread(target=func,args=(11,)) t1.start() t2=threading.Thread(target=func,args=(11,)) t2.start() print(123) 123  #先出来
11   #等两秒
11   #两个11一块儿出来
  ③让主线程不在等子线程执行完,主线程终止了全部子线程就都执行完  t2.setDaemon(True)
import time import threading def func(arg): time.sleep(2) print(arg) t1=threading.Thread(target=func,args=(11,)) t1.setDaemon(True) t1.start() t2=threading.Thread(target=func,args=(11,)) t2.setDaemon(True) t2.start() print(123)  #123
  ④开发者能够控制主线程等待子线程的最多等待时间
    没有参数:让主程序在这里等着,等这个子程序执行完毕才能够继续往下走
import time import threading def func(arg): time.sleep(2) print(arg) t1=threading.Thread(target=func,args=(11,)) t1.start() t1.join() t2=threading.Thread(target=func,args=(22,)) t2.start() t2.join() print(123)
    有参数:让主程序在这里最多等n秒,不管是否执行完毕,都会继续往下走,可是若是此时走到了最后,
    子程序还没执行完,程序不会中止,而是等子程序执行完再中止
import time import threading def func(arg): time.sleep(arg) print(arg) t1=threading.Thread(target=func,args=(4,)) t1.start() t1.join(1) t2=threading.Thread(target=func,args=(5,)) t2.start() t2.join(1) print(123)
  ⑤线程名称
import threading def func(arg): t=threading.current_thread() name=t.getName() print(name,arg) t1=threading.Thread(target=func,args=(11,)) t1.setName('我叫t1') t1.start() t2=threading.Thread(target=func,args=(12,)) a=t2.setName('我叫t2') t2.start() print(123)
  ⑥现成本质:t.start()并非开始线程的意思,而是告诉CPU,我已经准备就绪,你能够调度我了
import threading def func(arg): print(arg) t=threading.Thread(target=func,args=(11,)) t.start() print(123)
  ⑦面向对象版本的多线程
    通常写法
import threading def func(arg): print(arg) t=threading.Thread(target=func,args=(11,)) t.start()# 实际上,就是执行threading模块中Thread类的run方法,run方法就是执行target=xxx中的xxx方法
    还能够这样作
import threading class MyThread(threading.Thread):  #本身写一个类,直接继承Thread类,要执行run方法,首先从子类(本身写的类开始找),效果彻底相同
    def run(self): print(11111,self._args,self._kwargs) t1=MyThread(args=(11,)) t1.start() t1=MyThread(args=(22,)) t1.start()
总结:
Ⅰ应用程序,进程,线程之间的关系
一个应用程序(软件),能够有多个进程(默认只有一个),一个进程中能够有多个线程(默认只有一个)
Ⅱ为何要建立线程
线程是CPU工做的最小单元,在Java或C#中,建立线程能够利用多和优点实现并行操做
Ⅲ为何要建立进程
进程与进程之间可以实现数据隔离(进程是为了提供环境让线程工做)
相关文章
相关标签/搜索