博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
23 python多线程threading及线程同步
阅读量:4553 次
发布时间:2019-06-08

本文共 4058 字,大约阅读时间需要 13 分钟。

1 ################   多线程应用举例  写法1:  ####################################################  2 import threading  3 from time import ctime,sleep  4   5 def func1():  6     for i in range(5):  7         print "i={}".format(i)  8         sleep(1)  9  10 def func2(): 11     for j in range(5): 12         print "j={}".format(j) 13         sleep(1) 14  15 def main(): 16     print("start:",ctime()) 17     t1=threading.Thread(target=func1) 18     t2=threading.Thread(target=func2) 19  20     t1.start() 21     t2.start() 22  23     t1.join() 24     t2.join()   ## 这里最好是加join函数,因为如果不加,则不等前面执行完,则pint这个后面语句则会被执行(不会等待) 25     print '11111'  ## 即如果不加,则主线程不会等待子线程是否执行完 26  27 if __name__ == '__main__': 28     main() 29  30  31  32  33 ################   多线程应用举例  写法2:  #################################################### 34  35  36 import threading 37 from time import ctime,sleep 38  39 def func1(): 40     for i in range(5): 41         print "i={}".format(i) 42         sleep(1) 43  44 def func2(): 45     for j in range(5): 46         print "j={}".format(j) 47         sleep(1) 48  49  50 class mythread(threading.Thread)   ##继承threading类, 51     def __init__(self,func): 52         threading.Thread.__init__(self) 53         self.func=func 54  55     def run(self): 56         self.func() 57  58 def main(): 59     print("start:",ctime()) 60     t1=mythread(func1) 61     t2=mythread(func2) 62  63     t1.start() 64     t2.start() 65  66     t1.join() 67     t2.join()   ## 这里最好是加join函数,因为如果不加,则不等前面执行完,则pint这个后面语句则会被执行(不会等待) 68     print '11111'  ## 即如果不加,则主线程不会等待子线程是否执行完 69  70 if __name__ == '__main__': 71     main() 72  73  74 ########################## 线程同步  ################################################################ 75 说明: 76     多个进程同时操作一个资源,需要有线程同步,防止同时修改或访问,这样会造成数据错误。 77     如果不涉及操作同一个资源,(则也没有必要线程同步,只用多线程即可) 78  79  80 ## 线程的同步 81 import threading 82 from time import sleep 83  84 tickets=100 85  86 class Window(threading.Thread): 87     """docstring for Window.""" 88     def __init__(self, n,lock): 89         self.lock=lock 90         threading.Thread.__init__(self,name=n) ## 调用父类的构造方法 91     def take(self): 92         global tickets 93         while tickets>=1: 94             self.lock.acquire()  ##加锁 95  96             print ("%s:%d" %(threading.currentThread().name,tickets)) 97             tickets=tickets-1 98  99             self.lock.release() ##释放锁100             sleep(1)101 102     def run(self):   ## 复写你类的RUN函数,即覆盖了父类的run函数103         self.take()104 105 106 def main():107     lock=threading.Lock()108     for i in range(1,5):  ## 有4个窗口同时卖票109         name='w'+str(i)   ## 定义窗口名字110         w=Window(name,lock)  ##此窗口开始卖票(参数为窗口名,和锁对象),因为实例化的线程类,所以有5个线程111         w.start()  ## 调用父类的start方法112 113 if __name__ == '__main__':114     main()115 116 ------------------- 使用上下文管理器 with 进行同步---------------------117 118 说明:119     还可以使用with时lock的作用载,上面的代码lock.acquire() 和 lock.release()之间的代码 ,使用with包含即可。120 121 ## 线程的同步122 import threading123 from time import sleep124 125 tickets=100126 127 class Window(threading.Thread):128     """docstring for Window."""129     def __init__(self, n,lock):130         self.lock=lock131         threading.Thread.__init__(self,name=n) ## 调用父类的构造方法132     def take(self):133         global tickets134         while tickets>=1:135             # self.lock.acquire()  ##加锁136             with self.lock:      ## 使用with上下文管理器137                 print ("%s:%d" %(threading.currentThread().name,tickets))138                 tickets=tickets-1139 140             # self.lock.release()  ##释放锁141             sleep(1)142 143     def run(self):   ## 复写你类的RUN函数,即覆盖了父类的run函数144         self.take()145 146 147 def main():148     lock=threading.Lock()149     for i in range(1,5):  ## 有5个窗口同时卖票150         name='w'+str(i)   ## 定义窗口名字151         w=Window(name,lock)  ##此窗口开始卖票(参数为窗口名,和锁对象),因为实例化的线程类,所以有5个线程152         w.start()  ## 调用父类的start方法153 154 if __name__ == '__main__':155     main()156 157 --------------------- 使用信号量控制线程 --------------------------------

 

转载于:https://www.cnblogs.com/2mei/p/9254258.html

你可能感兴趣的文章
php静态和抽象
查看>>
Jolt:软件业的奥斯卡
查看>>
机器学习课程笔记 (1)
查看>>
基础数据类型 格式化输出
查看>>
第九周作业
查看>>
解析大型.NET ERP系统 单据编码功能实现
查看>>
互联网创业应该如何找到创意 - RethinkDB创始人Slava Akhmechet的几点建议
查看>>
互联网技术架构给我们的启示
查看>>
hbase redis mysql重要知识点总结
查看>>
取数字(dp优化)
查看>>
web app builder arcgis 自定义弹窗
查看>>
第六天冲刺
查看>>
Golang学习 - strconv 包
查看>>
ERROR util.Shell: Failed to locate the winutils binary in the hadoop binary path
查看>>
imx6 system boot
查看>>
[SDOI2017]硬币游戏
查看>>
Azure 网站、云服务和虚拟机比较
查看>>
Windows 10在2018四月更新中默认安装了OpenSSH客户端
查看>>
jQuery常用函数
查看>>
一个忙着找实习工作的大三在校生的真实感受!!!
查看>>