Python3多线程
来源:互联网 发布:nginx图片缓存服务器 编辑:程序博客网 时间:2024/06/05 02:39
学习Python线程:
Python3 线程中常用的两个模块为:
_thread
threading(推荐使用)
thread 模块已被废弃。用户可以使用 threading 模块代替。所以,在 Python3 中不能再使用”thread” 模块。为了兼容性,Python3 将 thread 重命名为 “_thread”。
Python中使用线程有两种方式:函数或者用类来包装线程对象。
函数式:调用 _thread 模块中的start_new_thread()函数来产生新线程。语法如下:
import threadingimport timedef someting(): for i in range(1,11): print(i) time.sleep(1)threading._start_new_thread(someting(),())print("main")
类方式:
class 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()
如果重写了start一定要调用父类的start,run会在start之后自动调用。join线程阻塞方法,哪个线程调用那个线程阻塞.
线程锁:
当多个线程同时进行任务时,为了保证不会有多个线程同时对同一个数据进行操作造成不可预料的后果,所以有了线程锁。
生成一个锁:
lock = threading.Lock()cond = threading.Condition(lock=lock)
锁当然有上锁和未上锁两种状态,当一个线程要访问数据时,必须要先获得锁,如果已经有别的线程获得锁,那么就进入等待状态,等别的线程把锁释放后,再进行操作。
下面是一个简单的线程锁代码:
import threadingimport timeimport randomclass Thread1(threading.Thread): def run(self): for i in range(1,11): if i==3: #当Thread1运行到3的时候进入 cond.acquire() #锁 cond.wait() #等待Thread2运行完成 cond.release() print(i) time.sleep(1)class Thread2(threading.Thread): def run(self): for i in range(30,19,-1): print(i) time.sleep(1) cond.acquire() cond.notify() #唤醒 cond.release()lock = threading.Lock()cond = threading.Condition(lock=lock)t1 = Thread1()t2 = Thread2()t1.start()t2.start()
然后是一个小demo,有4个和尚,一个做饭的三个吃饭的。
也就是经典的生产者和消费者,用到线程锁技术:
import threadingimport timeimport randomclass Huofu(threading.Thread): def __init__(self,name=None): threading.Thread.__init__(self) self.name = name def run(self): while True: cond.acquire() if len(guo)==0: for i in range(1,11): guo.append(i) print('做出第{0}个馒头'.format(i)) time.sleep(1) cond.notify_all() cond.release() cond2.acquire() cond2.wait() cond2.release()class Chihuo(threading.Thread): def __init__(self,name=None): threading.Thread.__init__(self) self.name = name def run(self): while True: mantou=None cond.acquire() if len(guo)==0: cond2.acquire() cond2.notify() cond2.release() cond.wait() else: mantou=guo.pop() cond.release() if mantou is not None: print('{0}正在吃{1}'.format(self.name,mantou)) time.sleep(random.randint(1,5))guo = []lock = threading.Lock()cond = threading.Condition(lock=lock)#吃的锁lock2 = threading.Lock()cond2 = threading.Condition(lock=lock2)#蒸馒头的锁Huofu(name='做饭和尚').start()Chihuo(name='长眉和尚吃饭').start()Chihuo(name='短眉和尚吃饭').start()Chihuo(name='中眉和尚吃饭').start()
阅读全文
0 0
- python3 多线程
- python3 多线程
- python3 多线程
- python3-多线程
- Python3 多线程
- python3多线程
- Python3 多线程
- Python3 多线程
- Python3多线程
- python3-多线程
- Python3多线程
- Python3 多线程下载代码
- python3 多线程爬虫
- python3的多线程操作
- Python3.5多线程问题
- python3 多线程编程
- Python3多线程编程
- python3 多线程爬虫
- Ueditor富文本编辑器使用详解
- python中字典的dic.setdefault()用法
- PHP 获取今日、昨日、本周、上周、本月的等等常用的起始时间戳和结束时间戳的时间处理类
- SAMBA 的实现原理以及使用方法
- Java枚举_动力节点Java学院整理
- Python3多线程
- git 导入maven项目 提示 is already imported into workspace
- 代码质量检测工具FindBugs、PMD和CheckStyle对比
- log4j+flume+HDFS实现日志存储
- MFC六大核心机制
- js设置cookie,并全站有效
- HTTP协议介绍
- 手机端解决页面缓存问题
- python3 Chilkat库example网址