一.time模块
常用的一种获取当前时间以及时间格式化的模块,模块名称:time
time模块在Python原生安装中就存在所以不需要进行任何安装操作,直接使用即可。导入方式: import time
1.常用方法
2.时间元祖 (2017,12,12,12,12,12,3,340,1)
3.时间格式
例子
print(time.altzone) #回格林威治西部的夏令时地区的偏移秒 北京-32400 九个小时
print(time.asctime()) #接受时间元组并返回一个可读的形式为”Tue Dec 11 18:07:14 2008”的24个字符的字符串。 print(time.asctime()) #Tue Dec 17 13:24:31 2019
print(time.asctime((2017,12,12,12,12,12,3,340,1))) #返回可读形式的当前时间#
# print(time.clock()**) #返回进程时间
#print(time.time()) #@@@@@返回当前时间的时间戳#
# print(time.ctime(times)) #@@@@@@@获取读形式的当前时间
# print(time.gmtime()) #返回时间元祖 返回的是格林威治时间元祖
(tm_year=2019, tm_mon=12, tm_mday=17, tm_hour=5, tm_min=36, tm_sec=42, tm_wday=1, tm_yday=351, tm_isdst=0)
print(time.localtime()) #@@@@@@返回时间元祖 返回的是当前时间#
time.strptime ** 时间戳转换为时间元祖,
time.mktime(formatTime) ‘’将时间元祖转换为时间字符串
times = time.time() ‘#获取当前时间戳
times = “2017-10-10 23:40:00”
formatTime = time.strptime(times,’%Y-%m-%d %H:%M:%S’)** ** #将字符串时间转换为时间元祖
print**(time.strftime(u’%Y-%m-%d %H:%M:%S’,formatTime))**# 2017-12-12 12:12:12
接收以时间元组,并返回指定格式可读字符串表示的当地时间,格式由fmt决定。
‘’’ time.strptime 将时间字符串转换为时间元祖’’’#
times = ‘2017-12-12 12:12:12’#转换为时间元祖#
formatTime = time.strptime(times,’%Y-%m-%d %H:%M:%S’)
二、进程与线程
1.进程与线程的区别
1.线程是程序执行的最小单位,而进程是操作系统分配资源的最小单位;
2.一个进程由一个或多个线程组成,线程是一个进程中代码的不同执行路线;
3.进程之间相互独立,但同一进程下的各个线程之间共享程序的内存空间(包括代码段、数据集、堆等)及一些进程级的资源(如打开文件和信号),某进程内的线程在其它进程不可见;
4.调度和切换:线程上下文切换比进程上下文切换要快得多。
thread模块和threading模块
thread不支持守护线程。当主线程退出时,所有的子线程不管它们是否还在工作,都会被强行退出。有时我们并不希望发生这种行为,这时就引入了守护线程的概念。threading模块支持守护线程
threading使用
threading.Thread(self, group=None, target=None, name=None, args=(), kwargs={})
参数group是预留的,用于将来扩展;
参数target是一个可调用对象(也称为活动[activity]),在线程启动后执行;
参数name是线程的名字。默认值为“Thread-N“,N是一个数字。
参数args和kwargs分别表示调用target时的参数列表和关键字参数。
方法一:
常用方法:
Thread.getName()/ Thread.name 用于获取线程的名称,有返回值,需要print打印出来
Thread.setName() 用于设置线程的名称,没有返回值,print打印出来事None
Thread.ident 获取线程的标识符。线程标识符是一个非零整数,只有在调用了start()方法之后该属性才有效,否则它只返回None。
Thread.is_alive() /Thread.isAlive 判断线程是否是激活的(alive)。从调用start()方法启动线程,到run()方法执行完毕或遇到未处理异常而中断这段时间内,线程是激活的。
Thread.join([timeout]) 调用Thread.join将会使线程堵塞,直到被调用线程运行结束或超时。参数timeout是一个数值类型,表示超时时间,如果未提供该参数,那么主调线程将一直堵塞到被调线程结束。
python对于thread的管理中有两个函数:
Join()和setDaemon()
join:如在一个线程B中调用thread1.join(),则thread1结束后,线程B才会接着threada.join()往后运行。
setDaemon:主线程A启动了子线程B,调用B.setDaemaon(True),则主线程结束时,会把子线程B也杀死。必须在运行线程之前设置.
Thread.isDaemon()/ Thread.daemon 用于获取线程的名称,有返回值,需要print打印出来
python多进程并发,模块名称:multiprocessing
python中的多线程其实并不是真正的多线程,如果想要充分地使用多核CPU的资源,在python中大部分情况需要使用多进程。
multiprocessing包是Python中的多进程管理包。与threading.Thread类似,它可以利用multiprocessing.Process对象来创建一个进程。该Process对象与Thread对象的用法相同,也有start(), run(), join()等方法。
此外multiprocessing包中也有Lock/Event/Semaphore/Condition类 (这些对象可以像多线程那样,通过参数传递给各个进程),用以同步进程,其用法与threading包中的Thread类一致。所以,multiprocessing的很大一部份与threading使用同一套API,只不过换到了多进程的情境。
multiprocessing提供了threading包中没有的IPC(比如Pipe和Queue),效率上更高。应优先考虑Pipe和Queue,避免使用Lock/Event/Semaphore/Condition等同步方式 (因为它们占据的不是用户进程的资源,而是线程)。
使用:
创建进程的类:Process([group [, target [, name [, args [, kwargs]]]]])
方法:is_alive()、join([timeout])、run()、start() 。其中,Process以start()启动某个进程。
Lock:可以避免访问资源时的冲突
Pool:可以提供指定数量的进程
Queue:多进程安全的队列,实现多进程之间的数据传递
Pipe:实现管道模式下的消息发送与接收
Pool
Pool可以提供指定数量的进程,供用户调用,当有新的请求提交到pool中时,如果池还没有满,那么就会创建一个新的进程用来执行该请求;但如果池中的进程数已经达到规定最大值,那么该请求就会等待,直到池中有进程结束,才会创建新的进程来执行它。
进程池方法:
apply(func[, args[, kwds]]): 阻塞的执行,比如创建一个有3个线程的线程池,当执行时是创建完一个,执行完函数再创建另一个,变成一个线性的执行.
apply_async(func[, args[, kwds[, callback]]]) : 它是非阻塞执行,同时创建3个线程的线城池,同时执行,只要有一个执行完立刻放回池子待下一个执行,并行的执行 .
close(): 关闭pool,使其不在接受新的任务。
terminate() : 结束工作进程,不在处理未完成的任务。
join(): 主进程阻塞,等待子进程的退出, join方法要在close或terminate之后使用。
Queue
进程彼此之间互相隔离,要实现进程间通信(IPC),multiprocessing模块支持两种形式:队列Queue和管道Pipe,这两种方式都是使用消息传递的
创建队列的类(底层就是以管道和锁定的方式实现):
Queue([maxsize]):创建共享的进程队列,Queue是多进程安全的队列,可以使用Queue实现多进程之间的数据传递。
参数介绍:maxsize是队列中允许最大项数,省略则无大小限制。
q.put方法用以插入数据到队列中,
put方法还有两个可选参数:blocked和timeout。如果blocked为True(默认值),并且timeout为正值,该方法会阻塞timeout指定的时间,直到该队列有剩余的空间。如果超时,会抛出Queue.Full异常。如果blocked为False,但该Queue已满,会立即抛出Queue.Full异常。
q.get方法可以从队列读取并且删除一个元素。
同样,get方法有两个可选参数:blocked和timeout。如果blocked为True(默认值),并且timeout为正值,那么在等待时间内没有取到任何元素,会抛出Queue.Empty异常。如果blocked为False,有两种情况存在,如果Queue有一个值可用,则立即返回该值,否则,如果队列为空,则立即抛出Queue.Empty异常.
q.get_nowait():同q.get(False)
q.put_nowait():同q.put(False)
q.empty():调用此方法时q为空则返回True,该结果不可靠,比如在返回True的过程中,如果队列中又加入了项目。
q.full():调用此方法时q已满则返回True,该结果不可靠,比如在返回True的过程中,如果队列中的项目被取走。
q.qsize():返回队列中目前项目的正确数量,结果也不可靠,理由同上.
Pipe
Pipe方法返回(conn1, conn2)代表一个管道的两个端。Pipe方法有duplex参数:duplex 为 True(默认值),那么这个管道是全双工模式,也就是说conn1和conn2均可收发。duplex 为 False,conn1只负责接受消息,conn2只负责发送消息。
send和recv方法分别是发送和接收消息的方法。在全双工模式下,可以调用conn1.send发送消息,conn1.recv接收消息。如果没有消息可接收,recv方法会一直阻塞。如果管道已经被关闭,那么recv方法会抛出EOFError
**queue.Queue是进程内非阻塞队列
multiprocess.Queue是跨进程通信队列。
**

