一、课件
二、课后习题
1、学习Python网络编程、Python数据库SQLite、Python多线程例程 学习三个例程代码,运行一下,把过程录屏,保存到视频文件中
2、基于Python多线程的代码,实现如下功能:
创建三个子线程,利用线程锁,操作同一个列表中的数据。
线程1,给列表增加1个元素;
线程2,给列表删除1个元素;
线程3,修改列表元素
3、基于Python多线程的代码,实现如下功能:
创建两个子线程,利用线程锁,实现两个子线程的死锁。
三、答案
1
1.1
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sqlite3
SQL_CREATE_TABLE = \
'''
CREATE TABLE COMPANY(
ID INT PRIMARY KEY NOT NULL,
NAME TEXT NOT NULL,
AGE INT NOT NULL,
ADDRESS CHAR(50),
SALARY REAL
);'''
SQL_INSERT_DATA = [
"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (1, 'Paul', 32, 'California', 20000.00 )",
"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (2, 'Allen', 25, 'Texas', 15000.00 )",
"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (3, 'Teddy', 23, 'Norway', 20000.00 )",
"INSERT INTO COMPANY (ID,NAME,AGE,ADDRESS,SALARY) VALUES (4, 'Mark', 25, 'Rich-Mond ', 65000.00 )",
]
SQL_QUERY_DATA = "SELECT id, name, address, salary from COMPANY"
SQL_UPDATE_DATA = "UPDATE COMPANY set SALARY = 25000.00 where ID=1"
SQL_DELETE_DATA = "DELETE from COMPANY where ID=2;"
def aikit_sqlite():
conn = sqlite3.connect('test.db')
# 新建COMPANY表
sqlite_exec_sql(conn, SQL_CREATE_TABLE)
print("Table created successfully")
# COMPANY表插入数据
for sql in SQL_INSERT_DATA:
sqlite_exec_sql(conn, sql)
print("Records created successfully")
cursor = sqlite_query(conn, SQL_QUERY_DATA)
for row in cursor:
print("ID = ", row[0])
print("NAME = ", row[1])
print("ADDRESS = ", row[2])
print("SALARY = ", row[3], "\n")
print("Query data successfully")
sqlite_exec_sql(conn, SQL_UPDATE_DATA)
sqlite_exec_sql(conn, SQL_DELETE_DATA)
conn.close()
def sqlite_exec_sql(conn, sql):
c = conn.cursor()
c.execute(sql)
conn.commit()
print("Total number of rows changes :", conn.total_changes)
def sqlite_query(conn, sql):
c = conn.cursor()
cursor = c.execute(sql)
return cursor
if __name__ == '__main__':
aikit_sqlite()
pass
1.2
#!/usr/bin/python
# -*- coding: utf-8 -*-
import sys
import socket
HOST = '127.0.0.1'
PORT = 8000
USAGE = '''Usage:
python aikit_network.py client
python aikit_network.py server'''
def socket_client():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 定义socket类型,网络通信,TCP
s.connect((HOST, PORT)) # 要连接的IP与端口
while True:
tx_data = input("Please input data: ") # 与人交互,输入命令
s.sendall(tx_data.encode(encoding='utf-8')) # 把命令发送给对端
rx_data = s.recv(1024) # 把接收的数据定义为变量
print('receive data from server: {0}\n'.format(rx_data))
if rx_data == b'bye':
break
s.close() # 关闭连接
print('Disconnect from the server')
def socket_server():
s = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 定义socket类型,网络通信,TCP
s.bind((HOST, PORT)) # 套接字绑定的IP与端口
s.listen(1) # 开始TCP监听,监听1个请求
print('start socket server')
conn, addr = s.accept() # 接受TCP连接,并返回新的套接字与IP地址
print('Connected by {0}'.format(addr)) # 输出客户端的IP地址
while True:
rx_data = conn.recv(1024) # 把接收的数据实例化
print('receive data from client: {0}\n'.format(rx_data))
if rx_data == b'bye':
conn.sendall(b'bye')
conn.close() # 关闭连接
print('Disconnect from the client')
break
else:
conn.sendall(rx_data)
s.close()
print('stop socket server')
if __name__ == '__main__':
if len(sys.argv) != 2:
print(USAGE)
exit(0)
if sys.argv[1] == 'client':
socket_client()
elif sys.argv[1] == 'server':
socket_server()
else:
print('Invalid parameter:{0}'.format(sys.argv[1]))
pass
1.3
import time
import threading
def func(n):
time.sleep(2)
print("子线程{1} {0}".format(time.time(), n))
if __name__ == '__main__':
for i in range(10):
t = threading.Thread(target=func, args=(i+1,))
t.start()
print('主线程结束')
i
2
import threading
# import time
LIST = [0, 0]
def add_lists(threadLock, i):
threadLock.acquire()
LIST.append("添加的元素")
print("添加列表成功", "线程{0}".format(i))
print(LIST)
threadLock.release()
# time.sleep(0.001)
def del_lists(threadLock, i):
threadLock.acquire()
LIST.pop()
print("删除列表成功", "线程{0}".format(i))
print(LIST)
threadLock.release()
# time.sleep(0.001)
def updata_lists(threadLock, i):
LIST
threadLock.acquire()
LIST[0] = "修改的元素"
print("修改列表成功", "线程{0}".format(i))
print(LIST)
threadLock.release()
# time.sleep(0.001)
if __name__ == '__main__':
threadLock = threading.Lock()
threading.Thread(target=add_lists, args=(threadLock, 1)).start()
threading.Thread(target=updata_lists, args=(threadLock, 2)).start()
threading.Thread(target=del_lists, args=(threadLock, 3)).start()
3
import threading
import time
lock1 = threading.Lock()
lock2 = threading.Lock()
def work1():
lock1.acquire()
time.sleep(1)
print("work1工作")
lock2.acquire()
lock2.release()
lock1.release()
def work2():
lock2.acquire()
print("work2工作")
lock1.acquire()
lock1.release()
lock2.release()
if __name__ == '__main__':
t1 = threading.Thread(target=work1)
t2 = threading.Thread(target=work2)
t1.start()
t2.start()
多线程卖票
#!/usr/bin/python
# -*- coding: UTF-8 -*-
import threading
import time
TOTALTICKET = 100
def sell_ticket(threadLock,i):
global TOTALTICKET
while TOTALTICKET > 0:
threadLock.acquire()
if TOTALTICKET > 0:
print("窗口{1}正在售第{0}张票".format(TOTALTICKET, i))
TOTALTICKET -= 1
threadLock.release()
time.sleep(0.1)
if __name__ == '__main__':
threadLock = threading.Lock()
for i in range(10):
t = threading.Thread(target=sell_ticket, args=(threadLock,i))
t.start()
Comments | NOTHING