1. 安装引入模块
- python
安装mysql模块
sudo apt-get install python-mysql
在文件中引入模块
import Mysqldb
- python3
安装mysql模块
sudo apt-get install pymysql
在文件中引入模块
import pymysql
2. 使用
1 | #!/usr/bin/python |
安装mysql模块sudo apt-get install python-mysql
在文件中引入模块import Mysqldb
安装mysql模块sudo apt-get install pymysql
在文件中引入模块import pymysql
1 | #!/usr/bin/python |
添加一整条数据
1 | insert into my_test values(0,'小明',0,'1999-1-1',0); |
添加不完整数据
1 | insert into my_students(name) values('小家电'); |
添加多条数据
1 | insert into my_test(name) values('阿姨'),('神雕'),('郭襄'); |
1 | delete from stus where id=5; |
1 | update students set birthday='1990-2-2' where id=2 |
查看列表所有数据
1 | select * from my_test; |
筛选数据
1 | select * from stus where isdelete=0; |
逻辑与运算与或非 and
, or
, not
1 | select * from stus where name='小米' and isdelete=0; |
模糊查询
1 | # %表示任意多个字符 |
1
2# 下划线数量表示占位符数量
select * from stus where name like '小_';
1 | select * from stus where id in (1,4,6); |
1 | # 编号3-8的男生 |
空判断
1 | # null 与 ‘’ 是不同的 |
优先级
1 | # 小括号>not>比较运算符>逻辑运算符 |
求总数 count()
1 | select count(*) from stus where isDelete=0; |
最大值 max()
1 | select max(id) from stus; |
最大值 min()
1 | select min(id) from stus; |
平均值 avg()
1 | select avg(id) from stus; |
求和 sum()
1 | select sum(id) from stus where gender=1; |
统计男女生人数
1 | select gender,count(*) from stus group by gender; |
分组后筛选
1 | select gender,count(*) from stus group by gender having gender=0; |
select * from 表 order by 列1 asc|desc,列2 asc|desc,...
1 | # 男生按id降序排列 |
语法
select * from 表 limit start,count;
从start开始,获取count条数据,start索引从0开始
1 select * from stus where isDelete=0 limit 1,3;
每页显示m条数据,当前是n页,n从1开始1
select * from stus where idDelete=0 limit (n-1)*m,m;
进入数据库
1 | mysql -uroot -p |
创建数据库
1 | create database my_test charset=utf8; |
查看数据库列表
1 | show databases; |
删除数据库
1 | drop database my_test; |
使用数据库
1 | use my_test |
查看当前数据库
1 | select database(); |
查看当前数据库所有表
1 | show tables; |
1 | # create table students(id int auto_increment primary key not null,name varchar(10) not null,gender bit default 1,birthday datetime); |
查看表信息
1 | desc my_test; |
添加列
1 | alter table students add isDelete bit default 0; |
重命名表
1 | rename table my_test to my_test2; |
python的thread模块是比较底层的模块,python的threading模块是对thread做了一些包装的,可以更加方便的被使用
1 | #coding=utf-8 |
1 | #coding=utf-8 |
start()
方法来启动1 | #coding=utf-8 |
1 | #coding=utf-8 |
主进程代码
1 | const electron = require('electron'); |
渲染进程代码
1 | var ipc = electron.ipcRenderer; |
渲染进程代码
1 | ipc.send('dianPing','点屏要传的参数') //向主线程发送点屏指令 |
主进程代码
1 | ipc.on('dianPing',function(event, arg) { |
当需要创建的子进程数量不多时,可以直接利用multiprocessing中的Process动态成生多个进程,但如果是上百甚至上千个目标,手动的去创建进程的工作量巨大,此时就可以用到multiprocessing模块提供的Pool方法。
初始化Pool时,可以指定一个最大进程数,当有新的请求提交到Pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到指定的最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来执行,请看下面的实例:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21from multiprocessing import Pool
import os,time,random
def worker(msg):
t_start = time.time()
print("%s开始执行,进程号为%d"%(msg,os.getpid()))
#random.random()随机生成0~1之间的浮点数
time.sleep(random.random()*2)
t_stop = time.time()
print(msg,"执行完毕,耗时%0.2f"%(t_stop-t_start))
po=Pool(3) #定义一个进程池,最大进程数3
for i in range(0,10):
#Pool.apply_async(要调用的目标,(传递给目标的参数元祖,))
#每次循环将会用空闲出来的子进程去调用目标
po.apply_async(worker,(i,))
print("----start----")
po.close() #关闭进程池,关闭后po不再接收新的请求
po.join() #等待po中所有子进程执行完成,必须放在close语句之后
print("-----end-----")
运行结果:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22----start----
0开始执行,进程号为21466
1开始执行,进程号为21468
2开始执行,进程号为21467
0 执行完毕,耗时1.01
3开始执行,进程号为21466
2 执行完毕,耗时1.24
4开始执行,进程号为21467
3 执行完毕,耗时0.56
5开始执行,进程号为21466
1 执行完毕,耗时1.68
6开始执行,进程号为21468
4 执行完毕,耗时0.67
7开始执行,进程号为21467
5 执行完毕,耗时0.83
8开始执行,进程号为21466
6 执行完毕,耗时0.75
9开始执行,进程号为21468
7 执行完毕,耗时1.03
8 执行完毕,耗时1.05
9 执行完毕,耗时1.69
-----end-----
1 | apply_async(func[, args[, kwds]]) :使用非阻塞方式调用func(并行执行,堵塞方式必须等待上一个进程退出才能执行下一个进程), |
apply堵塞式1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19from multiprocessing import Pool
import os,time,random
def worker(msg):
t_start = time.time()
print("%s开始执行,进程号为%d"%(msg,os.getpid()))
#random.random()随机生成0~1之间的浮点数
time.sleep(random.random()*2)
t_stop = time.time()
print(msg,"执行完毕,耗时%0.2f"%(t_stop-t_start))
po=Pool(3) #定义一个进程池,最大进程数3
for i in range(0,10):
po.apply(worker,(i,))
print("----start----")
po.close() #关闭进程池,关闭后po不再接收新的请求
po.join() #等待po中所有子进程执行完成,必须放在close语句之后
print("-----end-----")
运行结果:1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
220开始执行,进程号为21532
0 执行完毕,耗时1.91
1开始执行,进程号为21534
1 执行完毕,耗时1.72
2开始执行,进程号为21533
2 执行完毕,耗时0.50
3开始执行,进程号为21532
3 执行完毕,耗时1.27
4开始执行,进程号为21534
4 执行完毕,耗时1.05
5开始执行,进程号为21533
5 执行完毕,耗时1.60
6开始执行,进程号为21532
6 执行完毕,耗时0.25
7开始执行,进程号为21534
7 执行完毕,耗时0.63
8开始执行,进程号为21533
8 执行完毕,耗时1.21
9开始执行,进程号为21532
9 执行完毕,耗时0.60
----start----
-----end-----
npm install messenger
使用
1 | var messenger = require('messenger'); |
参考
github
Process之间有时需要通信,操作系统提供了很多机制来实现进程间的通信。
可以使用multiprocessing模块的Queue实现多进程之间的数据传递,Queue本身是一个消息列队程序,首先用一个小实例来演示一下Queue的工作原理:
1 |
|
运行结果:
1 |
|
初始化Queue()对象时(例如:q=Queue()),若括号中没有指定最大可接收的消息数量,或数量为负值,那么就代表可接受的消息数量没有上限(直到内存的尽头);
Queue.qsize():返回当前队列包含的消息数量;
Queue.empty():如果队列为空,返回True,反之False ;
Queue.full():如果队列满了,返回True,反之False;
Queue.get([block[, timeout]]):获取队列中的一条消息,然后将其从列队中移除,block默认值为True;
1)如果block使用默认值,且没有设置timeout(单位秒),消息列队如果为空,此时程序将被阻塞(停在读取状态),直到从消息列队读到消息为止,如果设置了timeout,则会等待timeout秒,若还没读取到任何消息,则抛出”Queue.Empty”异常;
2)如果block值为False,消息列队如果为空,则会立刻抛出”Queue.Empty”异常;
Queue.get_nowait():相当Queue.get(False);
Queue.put(item,[block[, timeout]]):将item消息写入队列,block默认值为True;
1)如果block使用默认值,且没有设置timeout(单位秒),消息列队如果已经没有空间可写入,此时程序将被阻塞(停在写入状态),直到从消息列队腾出空间为止,如果设置了timeout,则会等待timeout秒,若还没空间,则抛出”Queue.Full”异常;
2)如果block值为False,消息列队如果没有空间可写入,则会立刻抛出”Queue.Full”异常;
我们以Queue为例,在父进程中创建两个子进程,一个往Queue里写数据,一个从Queue里读数据:
1 | from multiprocessing import Process, Queue |
运行结果:
[图片上传失败…(image-c93ffd-1529046683003)]
如果要使用Pool创建进程,就需要使用multiprocessing.Manager()中的Queue(),而不是multiprocessing.Queue(),否则会得到一条如下的错误信息:
RuntimeError: Queue objects should only be shared between processes through inheritance.
下面的实例演示了进程池中的进程如何通信:
1 |
|
运行结果:
1 |
|