7.20 python线程3
2018-7-20 18:46:49 去俺弟家玩去 后天回来
1.复习
# !/usr/bin/env python
# !--*--coding:utf-8 --*--
# !@Time :2018/7/20 8:56
# !@Author TrueNewBee # 正确的学习方法
# input
# output
# correct 纠正 # 线程:
# 1.线程是进程中的执行单位
# 2.线程是cpu执行的最小单位
# 3.线程之间资源共享
# 4.线程的开启和关闭以及切换的时间开销远远小于进程
# 5.线程本身可以在同一时间使用多个cpu
# python 与 线程
# CPython解释器在解释代码过程中容易产生数据不安全的问题
# GIL全局解释器锁 锁的是线程
# threading
2.守护线程
# !/usr/bin/env python
# !--*--coding:utf-8 --*--
# !@Time :2018/7/20 9:04
# !@Author TrueNewBee
import time
from threading import Thread def func1():
while True:
print('*'*10)
time.sleep(1) def func2():
print('in func2')
time.sleep(5) if __name__ == '__main__':
t = Thread(target=func1, )
t.daemon = True
t.start()
t2 = Thread(target=func2, )
t2.start()
t2.join()
print('主线程') # 守护进程随着主进程代码的结束而结束(进程间资源不共享,所以想咋结束咋结束)
# 守护线程会在主线程结束之后等待其他子线程的结束才结束(线程间资源共享,所以不能主线程不能立马结束) # 主进程在执行完自己的代码之后不会立即结束,而是等待子进程结束之后 挥手子进程的资源 # import time
# from multiprocessing import Process
#
#
# def func():
# time.sleep(5)
#
#
# if __name__ == '__main__':
# Process(target=func, ).start()
3.锁
# !/usr/bin/env python
# !--*--coding:utf-8 --*--
# !@Time :2018/7/20 9:29
# !@Author TrueNewBee
# import time
# from threading import Thread, Lock # def func(lock1):
# global n
# lock1.acquire() # 加上一个锁
# # n = 1 python内部就是下面执行的
# temp = n
# time.sleep(0.2)
# n = temp - 1 # 9 刚取回来还没来得及赋值又被别人拿走了,所以得自己加个锁不让被人拿走
# lock1.release() # 换钥匙
#
#
# n = 10
# t_list = []
# lock = Lock()
# for i in range(10):
# t = Thread(target=func, args=(lock, ))
# t.start()
# t_list.append(t)
# for t in t_list:
# t.join()
# print(n) # 不加锁是9 加锁是 0 # 科学家吃面问题 经典死锁问题
# noodle_lock = Lock()
# fork_lock = Lock()
# 互斥锁
#
#
# def eat1(name):
# noodle_lock.acquire()
# print('%s拿到面条啦' % name)
# fork_lock.acquire()
# print('%s拿到叉子啦' % name)
# print('%s吃面' % name)
# fork_lock.release()
# noodle_lock.release()
#
#
# def eat2(name):
# fork_lock.acquire()
# print('%s拿到叉子啦' % name)
# time.sleep(1)
# noodle_lock.acquire()
# print('%s拿到面条啦' % name)
# print('吃面')
# noodle_lock.release()
# fork_lock.release()
#
#
# if __name__ == '__main__':
# Thread(target=eat1, args=('alex', )).start()
# Thread(target=eat2, args=('Egon',)).start()
# Thread(target=eat1, args=('bossJin',)).start()
# Thread(target=eat2, args=('zeZha',)).start()
import time
from threading import RLock, Thread fork_lock = noodle_lock = RLock() # 一个钥匙串上的两把钥匙
# 递归锁 为了解决死锁问题,可以acquire()多次, def eat1(name):
noodle_lock.acquire() # 一把钥匙
print('%s拿到面条啦' % name)
fork_lock.acquire()
print('%s拿到叉子啦' % name)
print('%s吃面' % name)
fork_lock.release()
noodle_lock.release() def eat2(name):
fork_lock.acquire()
print('%s拿到叉子啦' % name)
time.sleep(1)
noodle_lock.acquire()
print('%s拿到面条啦' % name)
print('%s吃面' % name)
noodle_lock.release()
fork_lock.release() if __name__ == '__main__':
Thread(target=eat1, args=('alex', )).start()
Thread(target=eat2, args=('Egon',)).start()
Thread(target=eat1, args=('bossJin',)).start()
Thread(target=eat2, args=('zeZha',)).start()
4.条件和定时器
# !/usr/bin/env python
# !--*--coding:utf-8 --*--
# !@Time :2018/7/20 11:25
# !@Author TrueNewBee
import time
from threading import Semaphore, Thread def func(sem1, a, b):
# 同一时间就让四个线程执行代码
sem1.acquire()
time.sleep(1)
print(a+b)
sem1.release() if __name__ == '__main__':
sem = Semaphore(4)
for i in range(10):
t = Thread(target=func, args=(sem, i, i+5))
t.start()
5.事件
# !/usr/bin/env python
# !--*--coding:utf-8 --*--
# !@Time :2018/7/20 11:31
# !@Author TrueNewBee
# 事件被创建的时候
# False状态
# wait() 阻塞
# True状态
# wait() 非阻塞
# clear 设置状态为False
# set 设置状态为True # 数据库- 文件夹
# 文件夹里有好多excel表格
# 1.能够更方便的对数据进行增删改查
# 2.安全访问的机制 # 伪代码 看现象:
# 起两个线程
# 第一个线程:连接数据库
# 等待一个信号,告诉我我们之间的网络是通的
# 连接数据库
# 第二个线程:检测与数据库之间的网络情况是否连通
# time.sleep(0,2)
# 将事件状态设置为True import time
import random
from threading import Thread, Event def connect_db(e1):
count = 0
while count < 3:
# 连接三次
e1.wait(0.5) # 状态是False的时候,我只等待1s
if e1.is_set() == True:
print('连接成功')
break
else:
count += 1
print('第%s次连接失败' % count)
else:
# 连接三次都都没连上,主动抛出异常
raise TimeoutError('数据库连接超时') def check_web(e2):
time.sleep(random.randint(0, 3))
e2.set() if __name__ == '__main__':
e = Event()
t1 = Thread(target=connect_db, args=(e, ))
t2 = Thread(target=check_web, args=(e, ))
t1.start()
t2.start()
7.20 python线程3的更多相关文章
- [python] 线程锁
参考:http://blog.csdn.net/kobeyan/article/details/44039831 1. 锁的概念 在python中,存在GIL,也就是全局解释器锁,能够保证同一时刻只有 ...
- [python] 线程简介
参考:http://www.cnblogs.com/aylin/p/5601969.html 我是搬运工,特别感谢张岩林老师! python 线程与进程简介 进程与线程的历史 我们都知道计算机是由硬件 ...
- Python 线程(threading) 进程(multiprocessing)
*:first-child { margin-top: 0 !important; } body>*:last-child { margin-bottom: 0 !important; } /* ...
- [python] ThreadPoolExecutor线程池 python 线程池
初识 Python中已经有了threading模块,为什么还需要线程池呢,线程池又是什么东西呢?在介绍线程同步的信号量机制的时候,举得例子是爬虫的例子,需要控制同时爬取的线程数,例子中创建了20个线程 ...
- Python学习——Python线程
一.线程创建 #方法一:将要执行的方法作为参数传给Thread的构造方法 import threading import time def show(arg): time.sleep(2) print ...
- python——线程相关
使用python的threading中的Thread 下面是两种基本的实现线程的方式: 第一种方式———— #coding=utf-8 """ thread的第一种声明及 ...
- python 线程,GIL 和 ctypes(转)
原文:http://zhuoqiang.me/python-thread-gil-and-ctypes.html GIL 与 Python 线程的纠葛 GIL 是什么东西?它对我们的 python 程 ...
- python 线程、多线程
复习进程知识: python:主进程,至少有一个主线程 启动一个新的子进程:Process,pool 给每一个进程设定一下执行的任务:传一个函数+函数的参数 如果是进程池:map函数:传入一个任务函数 ...
- python 线程 进程 协程 学习
转载自大神博客:http://www.cnblogs.com/aylin/p/5601969.html 仅供学习使用···· python 线程与进程简介 进程与线程的历史 我们都知道计算机是由硬件和 ...
随机推荐
- Spring3+mybatis3在多数据源情况下找不到数据库驱动的问题
解决问题的过程如下: 1.遇到问题和一般的解决方法和下面这个帖子的一样: http://www.oschina.net/question/188964_32305 2.我在按照1的做法配置了以后,依然 ...
- cesium导入3D模型(obj转gltf)
cesium中支持载入3D模型,不过只支持gltf格式.gltf是khronos组织(起草OpenGL标准的那家)定义的一种交换格式,用于互联网或移动设备上展现3d内容,充分支持opengl,webg ...
- Dubbo调用链(version:2.5.3)
Consumer 调用 Provider的过程: (CONSUMER)Dubbo服务调用处 --> 调用RPC代理 --> InvokerInvocationHandler#invoke( ...
- TIMEOUT HANDLING WITH HTTPCLIENT
https://www.thomaslevesque.com/2018/02/25/better-timeout-handling-with-httpclient/ The problem If yo ...
- SpringMVC------报错:java.lang.ClassNotFoundException: org.springframework.web.filter.CharacterEncodingFilter
详细信息: java.lang.ClassNotFoundException: org.springframework.web.filter.CharacterEncodingFilter 严重: E ...
- DBA操作
sqlplus sys/tiger as sysdba; alter user scott account unlock; 用户已更改 切换用户:conn scott/tiger as sysdba ...
- SpringMVC由浅入深day02_1课程安排_2包装类型pojo参数绑定_3集合类型绑定
springmvc第二天 高级知识 复习: springmvc框架: DispatcherServlet前端控制器:接收request,进行response HandlerMapping处理器映射器: ...
- 使用 redis “捕捉” “用户登录过期” 事件
实现原理及步骤: 1)登录时,计算登录过期时间,以分钟为单位作key(例如:sign_timeout_201705212233),value方面自己发挥,需要什么数据就拼什么数据进去,只是要注意,一定 ...
- osgearth2.8关于RectangleNodeEditor编辑点不可见的问题
static_cast<SphereDragger*>(_llDragger)->setColor(osg::Vec4(0,0,1,0)); Alpha写成了0 应该写成 stati ...
- 配置React Native环境及解决运行异常
一. 安装Homebrew: Homebrew的官网(多语言版本)简单明了地介绍了如何安装和使用这个工具,;并提供了自己的Wiki. brew的安装很简单,使用一条ruby命令即可,Mac系统上已经默 ...