关于python的多线程问题
程序员文章站
2022-03-02 19:25:07
...
在阅读代码的时候,碰到了python中多线程的问题。在这里做一个记录
mport time
import threading
def movie(func):
for i in range(2):
print "I am watching movie <%s>, time:%s"%(func,time.ctime())
time.sleep(5)
def music(func):
for i in range(2):
print "I am listennig music <%s>, time:%s "%(func,time.ctime())
time.sleep(3)
threads=[]
t1=threading.Thread(target=movie,args=("Movie funny",))
t2=threading.Thread(target=music,args=("Music funny",))
threads.append(t1)
threads.append(t2)
if __name__ == '__main__':
for i in threads:
i.start()
for i in threads:
i.join()
print "I am done, enjoy it."
输出:
I am watching movie <Movie funny>, time:Mon Jan 04 11:19:38 2016
I am listennig music <Music funny>, time:Mon Jan 04 11:19:38 2016
I am listennig music <Music funny>, time:Mon Jan 04 11:19:41 2016
I am watching movie <Movie funny>, time:Mon Jan 04 11:19:43 2016
I am done, enjoy it.
[Finished in 10.2s]
注意时间!以上代码属于函数式多线程。movie和music是同时运行的。然后一个经过了5秒,一个经过了3秒后结束。说明5秒的函数在运行的时候,3秒的函数也在运行。体现了我们写的代码没有错误。这是一个最简单的多线程案例。
使用对象包装多线程:
#!/usr/bin/env python
#-*-coding:utf-8-*-
import time
import threading
class ThreadTest(threading.Thread):
def __init__(self,name,pause):
threading.Thread.__init__(self)
self.name=name
self.pause=pause
self.thread_stop=False
def run(self):
while not self.thread_stop:
print "I am doing %s time : %s"%(self.name,time.ctime())
time.sleep(self.pause)
def stop(self):
self.thread_stop=True
def test():
t1=ThreadTest("movie",5)
t2=ThreadTest("music",2)
t1.start()
t2.start()
time.sleep(10)
t1.stop()
t2.stop()
if __name__ == '__main__':
test()
print "main done."
这个是使用类来封装多线程。类继承threading。包含初始化,运行,停止三个方法。如果没有停止的话就一直运行多线程里面定义的方法。我们可以看一下输出。证明一下我们的多线程是有效的
I am doing movie time : Mon Jan 04 13:55:33 2016
I am doing music time : Mon Jan 04 13:55:33 2016
I am doing music time : Mon Jan 04 13:55:35 2016
I am doing music time : Mon Jan 04 13:55:37 2016
I am doing movie time : Mon Jan 04 13:55:38 2016
I am doing music time : Mon Jan 04 13:55:39 2016
I am doing music time : Mon Jan 04 13:55:41 2016
I am doing movie time : Mon Jan 04 13:55:43 2016
main done.
一共运行了十秒,才停止。一个运行需要5秒,一个运行需要2秒。是多线程在运行的。
多线程还涉及到了锁,同步等
import random
import threading
#producer
class producer(threading.Thread):
def __init__(self,t_name):
threading.Thread.__init__(self,name=t_name)
def run(self):
global x
con.acquire()
if x>0:
con.wait()
else:
for i in range(5):
x+=1
print "producing..."+str(x)
con.notify()
print x
con.release()
class consumer(threading.Thread):
def __init__(self,t_name):
threading.Thread.__init__(self,name=t_name)
def run(self):
global x
con.acquire()
if x==0:
print "consumer waitting"
con.wait()
else:
for i in range(5):
x-=1
print str(x)+" ----\t consuming....%s"%(time.ctime(),)
con.notify()
print x
con.release()
con=threading.Condition()
x=0
print "start consumer.."
c=consumer("consumer")
print "start producing.."
p=producer("producer")
p.start()
c.start()
p.join()
c.join()
print "main done"
输出:
start consumer..
start producing..
producing...1
producing...2
producing...3
producing...4
producing...5
5
4 ---- consuming....Mon Jan 04 15:12:39 2016
3 ---- consuming....Mon Jan 04 15:12:39 2016
2 ---- consuming....Mon Jan 04 15:12:39 2016
1 ---- consuming....Mon Jan 04 15:12:39 2016
0 ---- consuming....Mon Jan 04 15:12:39 2016
0
main done
[Finished in 0.3s]
这个同步的线程还没有实际应用到。理解不是很深。
转载于:https://blog.51cto.com/ehealth/1731362