概述
多线程相关概念
进程:程序的一次执行,每个进程都有自己的地址空间、内存、数据栈以及其他辅助数据。进程之间内存空间、数据栈都是相互独立的,只能使用进程间通讯(IPC)共享信息。
pid:唯一标识符来标识进程,使用kill杀死进程
kill pid
线程:所有的线程运行在一个进程中,共享相同的运行环境。
主线程:创造一个进程的时候,会创造一个线程,这个线程被称为主线程,一个进程里只有一个主线程。
多线程的目的是并行运行相互独立的子任务,提升整个任务的效率。
最简单的例子:
import threading
def test():
print 1
a = threading.Thread(target = test)
#生成一个线程
a.start()
#启动线程
Python全局锁机制(GIL)
Python代码的执行由Python虚拟机来控制,对Python虚拟机的访问由全局解释锁Global Interpreter Lock来控制。
在任意一个指定的时间,有且只有一个线程在运行—->python是线程安全的。
在调用外部代码时,GIL也会被锁定,直到这个函数结束为止。
Python里的多线程,不是真正意义上的多线程。(丢手绢式)
import threading
import time
def test(p):
time.sleep(0.001)
#time.sleep(float)
程序会被挂起指定时间。
print p
ts = []
for i in xrange(0,15):
#迭代线程
th = threading.Thread(target=test,args=[i])
th.start()
ts.append(th)
for i in ts:
i.join()
print "hoho,end!!!!!"
多线程可以大大降低程序运行时间,但python中多线程复杂度高,不建议使用!
import time
import threading
def a():
print 'a begin'
time.sleep(2)
print 'a end'
def b():
print 'b begin'
time.sleep(2)
print 'b end'
b_time = time.time()
a()
b()
print time.time() - b_time
#代码完成时间 (4s左右)
b_time = time.time()
_a = threading.Thread(target=a)
_b = threading.Thread(target=b)
_a.start()
_b.start()
_a.join()
_b.join()
print time.time() - b_time
#代码完成时间 (2s左右)
io操作中的多线程
必须要lock,防止并行冲突。
互斥锁:
加锁 acquire 释放锁 release
加锁操作完后一定要释放,否则会变成死锁
import threading
mlock = threading.Lock()
#mlock = threading.RLock() 可重入锁,用法一样,防止死锁。
num = 0
def a():
global num
mlock.acquire()
#加锁
num += 1
#你要执行的代码,需要独占资源,比如文件的读写。
mlock.release()
#释放锁
print num
for i in xrange(0,10):
d = threading.Thread(target=a)
d.start()
最后
以上就是愉快麦片为你收集整理的Python中的多线程MultiThread的全部内容,希望文章能够帮你解决Python中的多线程MultiThread所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复