第13章 多线程编程
简单叙述创建线程的方法。 答:
Thread类支持使用两种方法来创建线程,一种是为构造函数传递一个可调用对象,另一种是继承Thread类并在派生类中重写__init__()和run()方法。创建了线程对象以后,可以调用其start()方法来启动,该方法自动调用该类对象的run()方法,此时该线程处于alive状态,直至线程的run()方法运行结束。
简单叙述Thread对象的方法。 答:
(1)join([timeout]:阻塞当前线程,等待被调线程结束或超时后再继续执行当前线程的后续代码,参数timeout用来指定最长等待时间,单位为秒。
(2)isAlive():测试线程是否处于运行状态
(3)start():自动调用run()方法,启动线程,执行线程代码。
(4)run():线程代码,用来实现线程的功能与业务逻辑,可以在子类中重写该方法来自定义线程的行为。
简单叙述线程对象的daemon属性的作用和影响。 答:
在脚本运行过程中有一个主线程,若在主线程中创建了子线程,当主线程结束时根据子线程daemon属性值的不同可能会发生下面的两种情况之一:1)当某子线程的daemon属性为False时,主线程结束时会检测该子线程是否结束,如果该子线程尚未完成,则主线程会等待它完成后再退出;2)当某子线程的daemon属性为True时,主线程运行结束时不对该子线程进行检查而直接退出,同时所有daemon值为True的子线程将随主线程一起结束,而不论是否运行完成。daemon属性的值默认为False,如果需要修改,则必须在调用start()方法启动线程之前进行修改。
解释至少3种线程同步方法。 答:
(1)使用Condition对象可以在某些事件触发后才处理数据,可以用于不同线程之间的通信或通知,以实现更高级别的同步。Condition对象除了具有acquire()和release()方法之外,
还有wait()、notify()、notify_all()等方法。下面通过经典生产者/消费者问题来演示Condition对象的用法。
(2)Queue模块(在Python 3中为queue模块)实现了多生产者/多消费者队列,尤其适合需要在多个线程之间进行信息交换的场合,该模块的Queue对象实现了多线程编程所需要的所有锁语义。
(3)Event对象是一种简单的线程通信技术,一个线程设置Event对象,另一个线程等待Event对象。Event对象的set()方法可以设置Event对象内部的信号标志为真;clear()方法可以清除Event对象内部的信号标志,将其设置为假;isSet()方法用来判断其内部信号标志的状态;wait()方法只有在其内部信号状态为真时将很快地执行并返回,若Event对象的内部信号标志为假,wait()方法将一直等待至超时或内部信号状态为真。
第14章 数据库编程
简单介绍SQLite数据库。 答:
SQLite是内嵌在Python中的轻量级、基于磁盘文件的数据库管理系统,不需要服务器进程,支持使用SQL语句来访问数据库。该数据库使用C语言开发,支持大多数SQL91标准,支持原子的、一致的、独立的和持久的事务,不支持外键限制;通过数据库级的独占性和共享锁定来实现独立事务,当多个线程同时访问同一个数据库并试图写入数据时,每一时刻只有一个线程可以写入数据。SQLite支持2TB大小的单个数据库,每个数据库完全存储在单个磁盘文件中,以B+树数据结构的形式存储,一个数据库就是一个文件,通过简单复制即可实现数据库的备份。
使用Python内置函数dir()查看Cursor对象中的方法,并使用内置函数help()查看其用法。
答:略。
叙述使用Python操作Access数据库的步骤。 答:
(1)建立数据库连接
import conn = '')
DSN = 'PROVIDER= SOURCE=C:/;' (DSN)
(2)打开记录集
rs = '')
rs_name = 'MyRecordset' #表名 ('[' + rs_name + ']', conn, 1, 3)
(3)操作记录集 ()
= 'data' ()
(4)操作数据 conn = '')
DSN = 'PROVIDER= SOURCE=C:/;'
sql_statement = \ (DSN)
(sql_statement) ()
(5)遍历记录
()
count = 0 while 1: if :
break else:
count = count + 1 ()
叙述使用Python操作MS SQL Server数据库的步骤。 答:
可以使用pywin32和pymssql两种不同的方式来访问MS SQL Server数据库。 先来了解一下pywin32模块访问MS SQL Server数据库的步骤。 (1)添加引用:
import adodbapi
= False # adds details to the sample printout import as adc
(2)创建连接:
Cfg = {'server':'','password':'xxxx','db':'pscitemp'}
constr = r\Initial Catalog=%s; Data Source=%s; user ID=%s; Password=%s; \(Cfg['db'], Cfg['server'], 'sa', Cfg['password']) conn = (constr)
(3)执行sql语句:
cur = ()
sql = '''select * from softextBook where title='{0}' and remark3!='{1}''''.format(bookName,flag) (sql) data = () ()
(4)执行存储过程:
#假设proName有三个参数,最后一个参数传了null
ret = ('procName',(parm1,parm2,None)) ()
(5)关闭连接 ()
接下来再通过一个示例来简单了解一下使用pymssql模块访问MS SQL Server数据库的方法。
import pymssql
conn = (host='SQL01', user='user', password='password', database='mydatabase') cur = ()
('CREATE TABLE persons(id INT, name VARCHAR(100))')
(\ALUES(%d, \ ()
('SELECT * FROM persons WHERE salesrep=', 'John Doe') row = () while row:
print \ row = ()
(\ ()
叙述MySQLDb模块提供的数据库访问方法。 答:
Python访问MySQL数据库可以使用MySQLDb模块,该模块主要方法有: ? commit() :提交事务。 ? rollback() :回滚事务。
? callproc(self, procname, args):用来执行存储过程,接收的参数为存储过程名和参数列表,返回值为受影响的行数。
? execute(self, query, args):执行单条sql语句,接收的参数为sql语句本身和使用的参数列表,返回值为受影响的行数。
? executemany(self, query, args):执行单条sql语句,但是重复执行参数列表里的参数,返回值为受影响的行数。
? nextset(self):移动到下一个结果集。 ? fetchall(self):接收全部的返回结果行。
? fetchmany(self, size=None):接收size条返回结果行,如果size的值大于返回的结果行的数量,则会返回条数据。 ? fetchone(self):返回一条结果行。