Python 多线程学习
来源:互联网 发布:黑白照片的魅力 知乎 编辑:程序博客网 时间:2024/06/07 03:33
线程
线程基本概念
什么是线程?
了解线程之前先说下进程。
进程:一个线程是进程的一个顺序执行流,进程是独立的所有子任务的集合,
线程是应用程序中工作的最小单元。线程:进程中的每个子任务,不能独立存在
线程,进程:目的都是想同时完成任务
- 各自的特点
- 进程的特点:独立(内存独立,cpu使用独立)启动进程开销大(速率低),进程之间很难共享数据,和数据通信,数据安全高。
- 线程的特点:依赖进程(内存共享,CPU使用独立)启动开销小,线程之间共享数据容易,方便通信,线程不安全。
- 各自的特点
- 线程的状态
创建线程
- Python3 线程中常用的两个模块为:
_thread
threading(推荐使用)
thread 模块已被废弃。用户可以使用 threading 模块代替。所以,在 Python3 中不能再使用”thread” 模块。为了兼容性,Python3 将 thread 重命名为 “_thread”。 - python中使用线程有两种方式:函数或用类来包装线程对象。
- 函数式:调用 _thread 模块中的start_new_thread()函数来产生新线程。
代码:
- 函数式:调用 _thread 模块中的start_new_thread()函数来产生新线程。
import threadingimport time# 为线程定义一个函数def someting(): for i in range(1,11): print(i) time.sleep(1)#创建一个函数threading._start_new_thread(someting(),())
2. 类方式 threading 模块创建线程 线程模块同样提供了Thread类来处理线程,Thread类提供了以下方法: run(): 用以表示线程活动的方法。 start():启动线程活动。 join([time]): 等待至线程中止。这阻塞调用线程直至线程的join() 方法被调用中止-正常退出或者抛出未处理的异常-或者是可选的超时发生。 isAlive(): 返回线程是否活动的。 getName(): 返回线程名。 setName(): 设置线程名。
import threadingimport timeclass Mythread(threading.Thread): def __init__(self): threading.Thread.__init__(self) print("Mythread") def run(self): for i in range(1,11): print(i) time.sleep(1) def start(self): print("开始Mythread") super().start()t=Mythread()t2 = Mythread()t.start()t2.start()
线程同步
使用 Thread 对象的 Lock 和 Rlock 可以实现简单的线程同步,这两个对象都有 acquire 方法和 release 方法,对于那些需要每次只允许一个线程操作的数据,可以将其操作放到 acquire 和 release 方法之间。
当多个线程同时进行任务时,为了保证不会有多个线程同时对同一个数据进行操作造成不可预料的后果,所以有了锁的概念,我们通过锁来使多线程任务更加安全。
1. 锁的创建
import threading
import time
counter = 0
counter_lock = threading.Lock()
counter_lock2 = threading.Lock()
counter_lock3 = threading.Lock()
可以定义多个锁, 当你需要独占某一资源时,任何一个锁都可以锁这个资源
就好比你用不同的锁都可以把相同的一个门锁住是一个道理。
import threadingimport timecounter = 0counter_lock = threading.Lock() #只是定义一个锁,并不是给资源加锁,你可以定义多个锁,像下两行代码,当你需要占用这个资源时,任何一个锁都可以锁这个资源counter_lock2 = threading.Lock()counter_lock3 = threading.Lock()class MyThread(threading.Thread): def __init__(self,name): threading.Thread.__init__(self) self.name = "Thread-" + str(name) def run(self): #run函数必须实现 global counter,counter_lock #多线程是共享资源的,使用全局变量 time.sleep(1); if counter_lock.acquire(): #当需要独占counter资源时,必须先锁定,这个锁可以是任意的一个锁,可以使用上边定义的3个锁中的任意一个 counter += 1 print ("I am %s, set counter:%s" % (self.name,counter)) counter_lock.release() #使用完counter资源必须要将这个锁打开,让其他线程使用if __name__ == "__main__": for i in range(1,101): my_thread = MyThread(i) my_thread.start()
同一个线程中,RLock.acquire可以被多次调用,利用该特性,可以解决部分死锁问题。
阅读全文
0 0
- Python多线程学习
- python 多线程学习
- Python多线程学习
- Python多线程学习
- Python多线程学习
- Python多线程学习
- Python多线程学习
- Python多线程学习
- Python多线程学习
- Python多线程学习
- python学习_多线程
- python多线程学习
- Python多线程学习
- python 多线程学习一
- Python多线程学习
- Python多线程学习
- Python多线程学习
- Python多线程学习<转>
- Xilinx Vivado的使用详细介绍(1):创建工程、编写代码、行为仿真、Testbench
- jmeter完成md5加密的接口请求参数
- POJ 2528 Mayor’s posters (线段树+离散化处理) 彻底搞懂延迟标记
- SSH连接服务器报ssh_exchange_identification: Connection closed by remote host
- 关于数据缺失
- Python 多线程学习
- 增长引擎
- 技术向:一文读懂卷积神经网络CNN
- 01_Scala基础语法
- 在Ubuntu 14.04 64bit上编译并研究State Threads网络线程库源码
- Basic template terminology
- IP对移动游戏领域的价值在哪里?
- C语言实现判断大端小端存储方式的代码
- java中的BigDecimal和String的相互转换