一、课件

二、课后习题

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()

欢迎欢迎~热烈欢迎~