Python学习第八天 | python在数据库的应用,浅谈多线程编程,浅谈socket网络编程

一,Python与数据库

1,安装准备
安装数据库数据库
yum install mariadb-server -y
systemctl start mariadb.service
修改密码
mysql_secure_installation
安装编译器
yum install gcc -y
安装MySQL-python
yum install MySQL-python -y
pip install Mysql-Python              ##pip需要在联网的情况下使用,是通用的Python包管理工具。提供了对 Python 包的查找、下载、安装、卸载的功能。

成功标志:pycharm中可以成功导入MySQLdb工具包

2,安装网页版的数据库phpMyAdmin(教程见https://blog.csdn.net/ha_weii/article/details/80466300

示例1:查看操作执行影响多少行

执行结果:

/usr/bin/python2.7 /home/kiosk/PycharmProjects/python/day08/mysql/01.py
3

示例2:查看数据库,默认以列表形式返回

执行结果:

/usr/bin/python2.7 /home/kiosk/PycharmProjects/python/day08/mysql/字典_查.py
3
(('haha', 'redhat', None, None), ('zm', 'nihao', 1L, 'class6'), ('tom', 'tom_passw', 89L, 'class5'))

示例3:查看数据库,以字典形式返回

执行结果:

/usr/bin/python2.7 /home/kiosk/PycharmProjects/python/day08/mysql/元组_查.py
3
({'username': 'haha', 'classroom': None, 'age': None, 'password': 'redhat'}, {'username': 'zm', 'classroom': 'class6', 'age': 1L, 'password': 'nihao'}, {'username': 'tom', 'classroom': 'class5', 'age': 89L, 'password': 'tom_passw'})

## 以元组形式返回

示例4:数据表增加字段

通用模板!!!

执行结果:

/usr/bin/python2.7 /home/kiosk/PycharmProjects/python/day08/mysql/增.py
1

示例5:删除数据

通用模板

执行结果:

/usr/bin/python2.7 /home/kiosk/PycharmProjects/python/day08/mysql/删.py
5

示例6:修改数据

执行结果:

/usr/bin/python2.7 /home/kiosk/PycharmProjects/python/day08/mysql/改.py
0

示例7:插入多条数据

### executemany与execute的区别!!!

示例8:事件和回滚

二,多线程编程

线程是操作系统能够进行运算调度的最小单元(程序执行流的最小单元)
它被包含在进程之中,是进程中实际运作单位,一个进程中可以并发多个线程
每条线程 并行执行不同的任务
(线程是进程中的一个实体,是被系统独立调度和分配的基本单元)

每一个进程启动时都会最先产生一个线程,即主线程
然后主线程会再创建其他的子线程

多线程能干什么:
生产者消费者问题:(经典)
一直生产 一直消费 中间有阀值 避免供求关系不平衡
线程安全问题,要是线程同时来,听谁的
# 锁: 一种数据结构 队列: 先进先出 栈:先进后出

生产者消费者的优点(为什么是经典的设计模式)
    1,解耦(让程序各模块之间的关联性降到最低)
        假设生产者和消费者是两个类,如果让生产者直接调用消费者的某个方法,那么生产者对于消费者就会产生依赖(也就是耦合),如果将消费者的代码发生变换,可能会影响到生产者,而如果两者都依赖于某个缓冲区,两者之间不直接依赖,耦合也就相应降低了
    生活中的例子:我们 邮筒 邮递员
举个例子,我们去邮局投递信件,如果不使用邮筒(也就是缓冲区),你必须得把信直接教给邮递员,有人会说,直接交给邮递员不是挺简单的嘛,其实不简单,你必须认识邮递员,才能把信给他(光凭一身的制服,万一有人假冒呢),这就产生你和有邮递员之间的依赖了(相当于生产者消费只强耦合),万一那天邮递员换人了.你还需要重新认识一下(相当于消费本身变化导致修改生产者代码),而邮筒相对来说比较固定,你依赖它的成本就比较低(相当于和缓冲区之间的弱耦合)
    2,支持开发
    生产者消费者是两个独立的并发体,他们之间是用缓冲区作为桥梁连接,生产者只需要往缓冲区丢数据,就可以继续下一个数据,而消费者只需要从缓冲区里拿数据即可,这样就不会因为彼此速度而发生阻塞
    接着上面的例子:如果我们不使用邮筒,我们就得在邮局等邮递员,我们才能把信交给他,这期间我们啥也不能干(也就是产生了阻塞),或者邮递员挨家挨户的问(产生轮询)
    3,支持忙闲不均
    如果制造数据的速度时快时慢,缓冲区的好处就体现出来了,当数据制造i快的时候,消费者来不及处理,未处理的数据可以暂时存在缓冲区中,等生产者的速度慢下来了,消费者再慢慢处理
    情人节信件太多了,邮递员一次处理不了,可以放在邮筒中,下次在来取

示例1:

注意一定要导入包!

示例2:模板

示例3:

示例4:

示例5:

执行结果:
/usr/bin/python2.7 /home/kiosk/PycharmProjects/python/day08/多线程/05.py
before
0
1
2
3
4
after
5
6
7
8
9

示例6:消费者生产者模型

注意:这个模型里面消费着需要等待,包子没了就等着厨师做好

执行结果:

/usr/bin/python2.7 /home/kiosk/PycharmProjects/python/day08/多线程/06.py
chef1 :Made a baozi..============
chef2 :Made a baozi..============
tom:Got a baozi..
harry:Got a baozi..
chef1 :Made a baozi..============harry:Got a baozi..

chef2 :Made a baozi..============tom:Got a baozi..


示例7:

与上一个生产者消费者模型的区别是这个模型中消费者get_nowait

执行结果:

/usr/bin/python2.7 /home/kiosk/PycharmProjects/python/day08/多线程/07.py
chef1 :Made a baozi..============chef2 :Made a baozi..============
 
tom:Got a baozi..
 harry:Got a baozi..chef2 :Made a baozi..============

harry:Got a baozi..
chef2 :Made a baozi..============
 harry:Got a baozi..
Exception in thread Thread-3:    ####开始供不应求,消费者丢失,程序报错!!!
Traceback (most recent call last):
  File "/usr/lib64/python2.7/threading.py", line 811, in __bootstrap_inner
    self.run()
  File "/usr/lib64/python2.7/threading.py", line 764, in run
    self.__target(*self.__args, **self.__kwargs)

示例8:通过异常处理程序,不会报错,也不会失去消费者,消费者等待做包子的过程

##加入异常处理程序,对于不知道的异常,直接打印一句话

/usr/bin/python2.7 /home/kiosk/PycharmProjects/python/day08/多线程/异常.py
chef1 :Made a baozi..============chef2 :Made a baozi..============

tom:Got a baozi..harry:Got a baozi..

chef2 :Made a baozi..============
chef2 :Made a baozi..============tom:Got a baozi..

tom:Got a baozi..没有包子了
没有包子了

没有包子了
没有包子了
没有包子了
没有包子了
chef1 :Made a baozi..============
harry:Got a baozi..没有包子了

示例9:加入判断语句,如果剩余包子小于3个,打印数量

##这里需要注释掉一个消费者,因为设置的两个消费者消费速度太快,不会出现剩余量

执行结果:

/usr/bin/python2.7 /home/kiosk/PycharmProjects/python/day08/多线程/异常2.py
chef1 :Made a baozi..============chef2 :Made a baozi..============

tom:Got a baozi..
chef1 :Made a baozi..============
tom:Got a baozi..
tom:Got a baozi..
chef2 :Made a baozi..============
chef2 :Made a baozi..============tom:Got a baozi..

tom:Got a baozi..
没有包子了
chef2 :Made a baozi..============
chef1 :Made a baozi..============
chef1 :Made a baozi..============
还有三个包子
tom:Got a baozi..

异步:主动询问,一直询问,响应了就成功
事件驱动:你询问之后,服务端主动响应你,就是你等着就行,好了叫你

示例10:异步

执行结果:

/usr/bin/python2.7 /home/kiosk/PycharmProjects/python/day08/多线程/异步.py
chef:等人来买包子
tom:去买包子
chef:someone is coming for 包子
chef:making a 包子 for someone
tom:waiting for 包子 to be ready
怎么还没好呀~
怎么还没好呀~
怎么还没好呀~
怎么还没好呀~
你的包子好了~
Thanks~


示例11:

执行结果:
/usr/bin/python2.7 /home/kiosk/PycharmProjects/python/day08/多线程/事件驱动.py
chef:等人来买包子
tom:去买包子
chef:someone is coming for 包子
chef:making a 包子 for someone
tom:waiting for 包子 to be ready
你的包子好了~
哎呀~真好吃

示例12:加法

示例13:加法安全版

注意:把接收到的数据先放入锁中先锁起来

三,浅谈socket网络编程

根据流程图编写程序

示例1:

server.py

client.py

注意:执行时,server.py要一直监听,然后再执行client.py

执行结果:

/usr/bin/python2.7 /home/kiosk/PycharmProjects/python/day08/socket编程/client.py
hello

###接收到了服务端的数据

一点解释:(可以看到类型是元组)

示例2:一直获取数据,直到出现了exit

client.py

#while循环持续获取数据,if判断退出

server.py

#while循环持续获取数据,if判断退出

注意:这个ip也可以是本机ip,不用回环接口,但是要保证client和server网络联通.

猜你喜欢

转载自blog.csdn.net/ha_weii/article/details/81213688