python多线程
来源:互联网 发布:德国网络布线 编辑:程序博客网 时间:2024/06/14 05:03
学习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
- Python多线程
- Python多线程
- Python多线程
- python多线程
- python 多线程
- python多线程
- python多线程
- python 多线程
- python多线程
- Python多线程
- Python 多线程
- python多线程
- python 多线程
- {python多线程}
- Python 多线程
- Python多线程
- python 多线程
- Python 多线程
- ReactiveX java
- JavaScript接口
- CSS的七种基本选择器及其权值
- DB2 常用SQL语法
- 第五周项目3---括号的匹配
- python多线程
- SQL进阶---第二单元(第一到第四课)、Queries
- HDOJ1237 逆波兰表达式
- leetcode--33. Search in Rotated Sorted Array
- ftpclient ftp客户端源码
- mysql 测试数据库employees导入
- git常用命令
- Qt—在ui设计中添加背景图片
- vscode离线安装插件