python程序中的线程操作

一、什么是线程?

  引子:

    进程:资源单位(起一个进程,仅仅只是在内存空间中开辟一块独立的空间)。

    线程:执行单位(真正干活的人也就是真正被CPU执行的,是进程里面的线程。线程指的是代码的执行过程,执行代码中所需要使用到的资源都找所在的进程索要)。

  将操作系统比喻一个大的工厂,

  那么进程就相当于工厂里的车间。

  线程就是车间里面的流水线。

  每一个进程肯定自带一个线程。 

总结:

  进程和线程都是虚拟单位,只是为了我们更加方便的描述问题

二、为何要有线程?

  对比分析:

    开设进程:

      1、申请内存空间  耗资源

      2、‘拷贝代码’      耗资源

    开设线程:

      一个进程内可以开设多个线程,在同一个进程内开设多个线程无需再申请内存空间。

  总结:

    1、开设线程的开销远远小于开设进程的开销。

    2、同一个进程下的多个线程数据是共享的。

我们要开发一款文本编辑器:

  需求:获取用户输入的功能、实时展示到屏幕的功能、自动保存到硬盘的功能

针对上面的三个功能,开设进程还是线程?

  答案:开设三个线程处理上面的三个功能更加的合理。

三、如何使用线程?

# encoding=utf-8
# auther:lsj
# 开启线程的方式一
from multiprocessing import Process
from threading import Thread
import time

def task(name):
    print('%s is running'%name)
    time.sleep(1)
    print('%s is over'%name)

# 开启线程不需要在main下面执行代码,直接书写即可
# 但是我们还是习惯性的将启动命令写在main下面
t = Thread(target=task,args=('lsj',))
t.start()
print('')

运行结果如下:
lsj is running主
lsj is over
线程与进程的区别:
1、进程的时候“主”先打印,线程的时候代码先打印。
2、创建进程需要先申请内存空间,而创建线程不需要申请内存空间。
3、创建线程的开销非常小,几乎是代码一执行线程就已经创建了。
  4、开启线程不需要在main下面执行代码,直接书写即可,开启进程时windows系统下必须使用main。
# encoding=utf-8
# auther:lsj
# 开启线程的方式一
from multiprocessing import Process
from threading import Thread
import time

def task(name):
    print('%s is running'%name)
    time.sleep(1)
    print('%s is over'%name)

# 开启线程不需要在main下面执行代码,直接书写即可
# 但是我们还是习惯性的将启动命令写在main下面
# t = Thread(target=task,args=('lsj',))
# t.start()
# print('主')
# 对比进程
if __name__ == '__main__':
    p = Process(target=task,args=('lsj',))
    p.start()
    print('')

进程的运行结果如下:
主
lsj is running
lsj is over

 

# encoding=utf-8
# auther:lsj
# 开启线程的方式二,使用类继承
from multiprocessing import Process
from threading import Thread
import time

class MyThread(Thread):
    def __init__(self,name):  # 针对双下划线开头和双下划线结尾(__init__)的方法 统一读成 双下init
        # 重写别人的方法又不知道别人的方法里有啥 调用父类的方法
        super().__init__()
        self.name = name
    def run(self):
        print('%s is running'%self.name)
        time.sleep(1)
        print('')

if __name__ == '__main__':
    t = MyThread('lsj')
    t.start()
    print('')


运行结果:
lsj is running主

牛

 

四、线程对象的join方法

# encoding=utf-8
# auther:lsj
# 线程的join方法
from multiprocessing import Process
import time
from threading import Thread
def task(name):
    print('%s is running'%name)
    time.sleep(3)
    print('%s is over'%name)

if __name__ == '__main__':
    t = Thread(target=task,args=('lsj',))
    t.start()
    t.join()  # 主线程要等待子线程运行完毕再继续运行
    print('')

不加join运行结果:
lsj is running
主
lsj is over


加入join运行结果:
lsj is running
lsj is over
主

 

 

 

 

 

 

 

 

 

 

原文地址:https://www.cnblogs.com/liunaixu/p/13185858.html