Python学习笔记——多线程编程(一)

  • Post author:
  • Post category:python


@

进程

#


一个执行中

的程序
@线程(轻量级进程)
#同一个进程下执行的,并共享相同的上下文
#线程包括开始、执行顺序和结束
#线程是以并发方式执行,单核CPU系统中,实现是每个线程执行一小会儿。
@GIL(全局解释器锁)
#I/O密集型的Python程序要比计算密集型的代码能够更好的利用多线程。
#多线程环境中,Python虚拟机按照下面所述的方式执行。
##设置GIL
##切换进一个线程去运行
##执行下面操作之一
###指定数量的字节码指令
###线程主动让出控制权(可以调用time.sleep(0))来完成
#把线程设置回睡眠状态(切换出线程)
#解锁GIL
#重复上述步骤
@

退出线程

#


还可以通过调用诸如


thread.exit()




类的退出函数,或者 sys.exit()之类的退出 Python 进程的标准方法,亦或者抛出 SystemExit异常,来使线程退出。不过,你不能直接“终止”一个线程。
@Python多线程模块
#thread (python3中改名为_thread不推荐使用)

#


threading(推荐使用)

#


Queue (


队列数据结构


)

@threading的使用

#创建Thread的实例,传给它一个函数

#创建Thread的实例,传给它一个可调用的类实例

#派生Thread的子类,并创建子类的实例。

@threading的属性和方法列表

#name         线程名

#ident         线程的标识符

#daemon    布尔标志,表示这个线程是否是守护线程

#__init__(group=None, target=None, name=None, args=(),kwargs={}, verbose=None, daemon=None)
#start()        开始执行线程
#run()        定义线程功能的方法
#join(timeout = None)

直至启动的线程终止之前一直挂起;除非给出了



timeout



(秒),否则

会一直阻塞

@创建Thread的实例,传给它一个函数

#例
#!/usr/bin/env python
# -*-coding:utf-8 -*-
import threading
from time import sleep, ctime
loops = [4, 2]
def loop(nloop, nsec):
print(‘start loop’, nloop, ‘at:’, ctime())
sleep(nsec)
print(‘loop’, nloop, ‘done at:’, ctime())
def main():
print(‘starting at:’, ctime())
threads = []
nloops = range(len(loops))
for i in nloops:
t = threading.Thread(target=loop, args=(i, loops[i]))
threads.append(t)
for i in nloops:
threads[i].start()
for i in nloops:
threads[i].join()
print(‘all DONE at:’)
if __name__ == ‘__main__’:
main()
@创建Thread的实例,传给它一个可调用的类实例
import threading
from time import sleep, ctime
loops = [2, 4]
class ThreadFunc(object):
def __init__(self, func, args, name=”):
self.name = name
self.func = func
self.args = args
def __call__(self):
self.func(*self.args)
def loop(nloop, nsec):
print(‘start loop’, nloop, ‘at:’, ctime())
sleep(nsec)
print(‘loop’, nloop, ‘done at:’, ctime())
def main():
print(‘starting at:’, ctime())
threads = []
nloops = range(len(loops))
for i in nloops:
t = threading.Thread(
target=ThreadFunc(loop, (i, loops[i]),
loop.__name__))
threads.append(t)
for i in nloops:
threads[i].start()
for i in nloops:
threads[i].join()
print(“all Done at:”, ctime())
if __name__ == ‘__main__’:
main()
@

派生


Thread


的子类,并创建子类的实例
import threading
from time import sleep, ctime
loops = [2, 4]
class MyThread(threading.Thread):
def __init__(self, func, args, name=”):
threading.Thread.__init__(self)
self.name = name
self.func = func
self.args = args
def run(self):
self.func(*self.args)
def loop(nloop, nsec):
print(‘start loop’, nloop, ‘at:’, ctime())
sleep(nsec)
print(‘loop’, nloop, ‘done at:’, ctime())
def main():
print(‘starting at:’, ctime())
threads = []
nloops = range(len(loops))
for i in nloops:
t = MyThread(loop, (i, loops[i]), loop.__name__)
threads.append(t)
for i in nloops:
threads[i].start()
for i in nloops:
threads[i].join()
print(‘all DONE at:’, ctime())
if __name__ == ‘__main__’:
main()



版权声明:本文为glfxml原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。