Python学习日志——多线程编程(二)

一.线程
1.1 线程介绍

1.实现多任务的另一种形式
2.线程是程序执行的最小单位
3.同属一个进程的多个线程共享进程所拥有的全部资源

1.2 创建步骤

#1.导入线程包

import threading

#2.通过线程类创建进程对象

线程对象 = threading.Thread(target=任务名)

#3.启动线程执行任务

线程对象.start()

1.3 执行顺序

线程间的执行顺序是无序的,是由CPU调度决定某个线程先执行的。

1.4 线程的参数传递与守护主线程的用法与进程一致,此处不再赘述。特别注意设置守护主线程时要在 线程对象.start() 之前。

二. 进程和线程的关系

进程只负责分配资源,线程利用这些资源来执行程序,也就是说进程是线程的容器,一个进程最少有一个线程来负责执行程序,同时线程自己不拥有系统资源,它与同属于一个进程的其它线程共享进程所拥有的全部资源。

关系

  • 线程是依附在进程里面的,没有进程就没有线程
  • 一个进程默认提供一条线程,进程可以创建多个线程

区别

  • 创建进程的资源开销要比创建线程的资源开销要大
  • 进程是操作系统资源分配的基本单位,线程是CPU调度的基本单位
  • 线程不能够独立执行,必须依存在进程中

优缺点

进程:
优点:可以用多核
缺点:资源开销大
线程:
优点:资源开销小
缺点:不可用多核

三. 全局变量问题

  • 进程之间不共享全局变量
    创建子进程会对主进程资源进行拷贝,也是就子进程是主进程的一个副本,因此不同进程里的全局变量只是名字相同而已。
  • 线程之间共享全局变量
    由于线程依附于进程,一个进程中的线程使用的是同一个进程中的资源,即同一个为全局变量。

线程间共享全局变量问题
原因:两个线程间因抢占CPU问题使计算结果错误
解决方法
1.join
2.互斥锁
互斥锁的使用步骤:

# 1 创建锁
	mutex = threading.Lock()
# 2 上锁
	mutex.acquire()
# 3 释放锁
	mutex.release()

注:只上锁,不解锁可能会发生死锁问题。同一把锁必须先解锁才能再上锁。否则当线程一上锁后没有解锁,线程二无法上锁,CPU只能等待,无法结束程序。

你可能感兴趣的:(Python学习日志,python)