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 线程与进程简介 进程与线程的历史 我们都知道计算机是由硬件和 ...
随机推荐
- linux中如何对一个文件的内容进行处理,文件中每行有多个字段的值,中间用空格分隔开?
需求描述: 今天在帮同事看个需求,将操作系统上的文件进行修改名字,改为特定的名字,所以呢,就先把这些原名字及对应的新名字关系放到了一个文本中,对于这个文本执行循环. 文件格式如下: .00000005 ...
- Go中error类型的nil值和nil
https://my.oschina.net/chai2010/blog/117923
- 开发kendo-ui弹窗组件
摘要: kendo-ui中只是提供了windwo插件,并没有提供页内弹窗插件.现在分享项目中自己定制的基于window组件的弹窗插件,如果你的项目也是用的kendo-ui,只需要将组件代码引到项目中即 ...
- SQL优化|Java面试题
转载:https://www.cnblogs.com/Jacck/p/8030455.html 数据库的优化问题 一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂 ...
- 数据注解特性--NotMapped
NotMapped特性可以应用到领域类的属性中,Code-First默认的约定,是为所有带有get,和set属性选择器的属性创建数据列.. NotManpped特性打破了这个约定,你可以使用NotMa ...
- C#------如何处理缺少对公共可见类型或成员的xml注释的警告
出现警告的原因: 使用Swagger框架时 如图,只要加上注释就可以了 使用前: 使用后:
- Greenplum-cc-web安装
第一章 文档概述 1. 本安装手册描述适用于Greenplum4.0以上版本的安装Greenplum-cc-web操作 第二章 安装介质 针对Greenplum版本下载对应Greenplum-cc-w ...
- MySQL on Linux 部署手册
1. 背景 MySQL为开源数据库,因此可以基于源码实现安装.基于源码安装有更多的灵活性.也就是说我们可以针对自己的硬件平台选用合适的编译器来优化编译后的二进制代码,根据不同的软件平台环境调整相关的编 ...
- date 类型转为varchar
select t.type_id as typeId, t.type_name as typeName, t.type_order as typeOrder, t.type_link as typeL ...
- 在css中 父元素不固定高度,怎样实现子元素的高度100%
父元素使用 position: relative; 子元素使用 position: absolute; height: 100%;