python成长之路11
生活随笔
收集整理的這篇文章主要介紹了
python成长之路11
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一.線程: 創建線程有兩種方式(本質是一樣的,創建好線程之后,cpu調度創建好的線程時執行的其實是Thread的run()方法): import threading
def f1(args):
print(args)
#方式一
t=threading.Thread(target=f1,args=(123,))
t.start()
#方式二
class MyThread(threading.Thread):
def __init__(self,func,args):
self.func=func
self.args=args
super(MyThread,self).__init__()
def run(self):
self.func(self.args)
t1=MyThread(f1,123)
t1.start() 123 123 隊列: import queue
q=queue.Queue(2)
q.put(1)
q.put(2)
q.put(3,block=False) #設置不阻塞(block為False),插不進去直接報錯 Traceback (most recent call last): File "/Users/admin/Desktop/zy/test.py", line 10, in <module> q.put(3,block=False) ? File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/queue.py", line 130, in put raise Full queue.Full import queue,threading,time
def f1(q):
q.put(123,timeout=3) #超時5s沒有插進隊列就會拋異常
q=queue.Queue(2)
q.put(1)
q.put(2)
t=threading.Thread(target=f1,args=(q,)) #子線程插入第三條數據
t.start() #創建好子線程啦,等待cpu調度
#情況一:
time.sleep(1) #主線程等待1s,子線程put超時3秒,先主線程get,后子線程put,put成功
#情況二:
time.sleep(5) #主線程等待5s,子線程put超時3秒,主線程沒來得及get,子線程就put,會報錯
q.get() import queue
q=queue.Queue()
q.put(1)
q.put(2)
print(q.get())
print(q.get())
print(q.get(block=False)) #設置不阻塞(block為False),隊列里沒有數據會報錯 1 Traceback (most recent call last): 2 File "/Users/admin/Desktop/zy/test.py", line 12, in <module> print(q.get(block=False)) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/queue.py", line 161, in get raise Empty queue.Empty import queue,threading,time
def f1(q):
print(q.get(timeout=3))
q=queue.Queue()
q.put(1)
q.put(2)
print(q.get())
print(q.get())
t=threading.Thread(target=f1,args=(q,))
t.start()
#情況一:
time.sleep(1) #主線程等待1s,子線程超時3s,主線程先put,子線程后get,不會報錯
#情況二:
time.sleep(5) #主線程等待5s,子線程超時3s,子線程先get,主線程再put,子線程get不到數據,直接報錯
q.put(3) #!/usr/bin/env python
# -*- coding:utf-8 -*-
import queue
#隊列:先進先出
q=queue.Queue(10) #隊列最大長度,默認是0 無限大
q.put(11,timeout=5) #放數據,默認阻塞True 阻塞時可以設置超時時間
q.put(22,block=False) #非阻塞,不等待
size=q.qsize() #隊列長度
data=q.get(timeout=5) #取數據 默認阻塞True 阻塞時可以設置超時時間
data=q.get(block=False) #非阻塞,不等待
bool_num=q.empty() #隊列為空返回True
bool_num=q.full() #隊列滿了返回True
q.join() #阻塞進程,當隊列中任務執行完畢之后(q.task_done),不再阻塞
q.task_done() import queue
#隊列:先進先出
q=queue.Queue(2) #隊列最大長度,默認是0 無限大
q.put(11)
q.task_done()
q.put(22)
q.join() 阻塞進程 import queue
#隊列:先進先出
q=queue.Queue(2) #隊列最大長度,默認是0 無限大
q.put(11)
q.task_done()
q.put(22) #每執行完一步要執行下q.taskdone()
q.task_done()
q.join() 不阻塞 import queue
#隊列:后進先出
q=queue.LifoQueue(5)
q.put(123) #優先級相同,先進先出
q.put(345)
q.put(456)
print(q.get())
print(q.get())
print(q.get()) 456 345 123 import queue
#隊列:優先級
q=queue.PriorityQueue(5)
q.put((0,123)) #優先級相同,先進先出
q.put((1,345))
q.put((0,456))
print(q.get())
print(q.get())
print(q.get()) (0,?123) (0,?456) (1,?345) import queue
#隊列:雙向隊列
q=queue.deque()
q.append(123)
q.append(456)
q.appendleft(789)
q.appendleft(890)
# 980 789 123 456
print(q.pop())
print(q.popleft()) 456 890 生產者消費者模型:功能:1.客戶端不阻塞,不持續占用連接,解決瞬時高并發 ? 2.程序解耦合(生產者改變不影響消費者那端) #!/usr/bin/env python
# -*- coding:utf-8 -*-
import threading,queue,time
q=queue.Queue(50)
def producter(user):
print("%s來買票啦" % user)
q.put("%s來買票啦" % user)
def consumer():
who=q.get()
time.sleep(5)
print(who + "--出票")
for i in range(4):
user="user" + str(i)
t=threading.Thread(target=producter,args=(user,))
t.start()
while True:
t1=threading.Thread(target=consumer)
t1.start() user0來買票啦 user1來買票啦 user2來買票啦 user3來買票啦 user1來買票啦--出票 user0來買票啦--出票 user2來買票啦--出票 user3來買票啦--出票 線程里鎖的機制: 應用程序的最小單位是線程,他們共用這個應用程序里的資源,如果同時對某個數據進行修改的話,就會產生臟數據 解決:鎖? #!/usr/bin/env python
# -*- coding:utf-8 -*-
import threading,queue,time
q=queue.Queue(5)
def producter(user):
print("%s來買票啦" % user)
q.put("%s來買票啦" % user)
num=12
def consumer(lock):
global num
lock.acquire() #上鎖
who=q.get()
num-=1
time.sleep(2)
print(who + "--出票","剩余票數:%d" % num)
lock.release() #開鎖
for i in range(4):
user="user" + str(i)
t=threading.Thread(target=producter,args=(user,))
t.start()
#lock=threading.Lock()
lock=threading.RLock() #構建鎖對象 Lock只能加一重鎖 RLock可以加多重鎖
while True:
t1=threading.Thread(target=consumer,args=(lock,))
t1.start() user0來買票啦 user1來買票啦 user2來買票啦 user3來買票啦 user0來買票啦--出票?剩余票數:11 user1來買票啦--出票?剩余票數:10 user2來買票啦--出票?剩余票數:9 user3來買票啦--出票?剩余票數:8 #lock=threading.Lock()
#lock=threading.RLock() #構建鎖對象 Lock只能加一重鎖 RLock可以加多重鎖
lock=threading.BoundedSemaphore(2) #上面兩種鎖都是每次放行1個線程,這個可放行多個 一次放行2個線程 #!/usr/bin/env python
# -*- coding:utf-8 -*-
import threading
def func(i,event):
print(i)
event.wait() #監測是什么燈,紅燈停綠燈行
print(i+100)
event=threading.Event() #信號 收到信號就放行所有線程
for i in range(4):
t=threading.Thread(target=func,args=(i,event,))
t.start()
event.clear() #設置成紅燈
inp=input(">>>:")
if inp == "1":
event.set() #設置成綠燈 0 1 2 3 >>>:1 100 101 102 103
線程池: #!/usr/bin/env python
# -*- coding:utf-8 -*-
import queue,threading,time
class ThreadPool:
def __init__(self,maxsize=5):
self.maxsize=maxsize
self._q=queue.Queue(maxsize)
for i in range(maxsize):
self._q.put(threading.Thread)
def get_thread(self):
return self._q.get()
def add_thread(self):
self._q.put(threading.Thread)
pool=ThreadPool(5)
def task(args,p):
print(args)
time.sleep(2)
p.add_thread()
for i in range(10):
t=pool.get_thread()
obj = t(target=task,args=(i,pool,))
obj.start() 3個缺點: 1.? 進程: 共享空間: #!/usr/bin/env python
# -*- coding:utf-8 -*-
from multiprocessing import Process
from multiprocessing import queues
import multiprocessing
from multiprocessing import Manager
def foo(i,args):
args[i]=i+100
print(args.values())
if __name__ == "__main__":
obj=Manager()
li=obj.dict()
for i in range(5):
p = Process(target=foo,args=(i,li,))
p.start()
import time
time.sleep(2) [101] [101,?102] [101,?102,?103] [100,?101,?102,?103] [100,?101,?102,?103,?104]
def f1(args):
print(args)
#方式一
t=threading.Thread(target=f1,args=(123,))
t.start()
#方式二
class MyThread(threading.Thread):
def __init__(self,func,args):
self.func=func
self.args=args
super(MyThread,self).__init__()
def run(self):
self.func(self.args)
t1=MyThread(f1,123)
t1.start() 123 123 隊列: import queue
q=queue.Queue(2)
q.put(1)
q.put(2)
q.put(3,block=False) #設置不阻塞(block為False),插不進去直接報錯 Traceback (most recent call last): File "/Users/admin/Desktop/zy/test.py", line 10, in <module> q.put(3,block=False) ? File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/queue.py", line 130, in put raise Full queue.Full import queue,threading,time
def f1(q):
q.put(123,timeout=3) #超時5s沒有插進隊列就會拋異常
q=queue.Queue(2)
q.put(1)
q.put(2)
t=threading.Thread(target=f1,args=(q,)) #子線程插入第三條數據
t.start() #創建好子線程啦,等待cpu調度
#情況一:
time.sleep(1) #主線程等待1s,子線程put超時3秒,先主線程get,后子線程put,put成功
#情況二:
time.sleep(5) #主線程等待5s,子線程put超時3秒,主線程沒來得及get,子線程就put,會報錯
q.get() import queue
q=queue.Queue()
q.put(1)
q.put(2)
print(q.get())
print(q.get())
print(q.get(block=False)) #設置不阻塞(block為False),隊列里沒有數據會報錯 1 Traceback (most recent call last): 2 File "/Users/admin/Desktop/zy/test.py", line 12, in <module> print(q.get(block=False)) File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/queue.py", line 161, in get raise Empty queue.Empty import queue,threading,time
def f1(q):
print(q.get(timeout=3))
q=queue.Queue()
q.put(1)
q.put(2)
print(q.get())
print(q.get())
t=threading.Thread(target=f1,args=(q,))
t.start()
#情況一:
time.sleep(1) #主線程等待1s,子線程超時3s,主線程先put,子線程后get,不會報錯
#情況二:
time.sleep(5) #主線程等待5s,子線程超時3s,子線程先get,主線程再put,子線程get不到數據,直接報錯
q.put(3) #!/usr/bin/env python
# -*- coding:utf-8 -*-
import queue
#隊列:先進先出
q=queue.Queue(10) #隊列最大長度,默認是0 無限大
q.put(11,timeout=5) #放數據,默認阻塞True 阻塞時可以設置超時時間
q.put(22,block=False) #非阻塞,不等待
size=q.qsize() #隊列長度
data=q.get(timeout=5) #取數據 默認阻塞True 阻塞時可以設置超時時間
data=q.get(block=False) #非阻塞,不等待
bool_num=q.empty() #隊列為空返回True
bool_num=q.full() #隊列滿了返回True
q.join() #阻塞進程,當隊列中任務執行完畢之后(q.task_done),不再阻塞
q.task_done() import queue
#隊列:先進先出
q=queue.Queue(2) #隊列最大長度,默認是0 無限大
q.put(11)
q.task_done()
q.put(22)
q.join() 阻塞進程 import queue
#隊列:先進先出
q=queue.Queue(2) #隊列最大長度,默認是0 無限大
q.put(11)
q.task_done()
q.put(22) #每執行完一步要執行下q.taskdone()
q.task_done()
q.join() 不阻塞 import queue
#隊列:后進先出
q=queue.LifoQueue(5)
q.put(123) #優先級相同,先進先出
q.put(345)
q.put(456)
print(q.get())
print(q.get())
print(q.get()) 456 345 123 import queue
#隊列:優先級
q=queue.PriorityQueue(5)
q.put((0,123)) #優先級相同,先進先出
q.put((1,345))
q.put((0,456))
print(q.get())
print(q.get())
print(q.get()) (0,?123) (0,?456) (1,?345) import queue
#隊列:雙向隊列
q=queue.deque()
q.append(123)
q.append(456)
q.appendleft(789)
q.appendleft(890)
# 980 789 123 456
print(q.pop())
print(q.popleft()) 456 890 生產者消費者模型:功能:1.客戶端不阻塞,不持續占用連接,解決瞬時高并發 ? 2.程序解耦合(生產者改變不影響消費者那端) #!/usr/bin/env python
# -*- coding:utf-8 -*-
import threading,queue,time
q=queue.Queue(50)
def producter(user):
print("%s來買票啦" % user)
q.put("%s來買票啦" % user)
def consumer():
who=q.get()
time.sleep(5)
print(who + "--出票")
for i in range(4):
user="user" + str(i)
t=threading.Thread(target=producter,args=(user,))
t.start()
while True:
t1=threading.Thread(target=consumer)
t1.start() user0來買票啦 user1來買票啦 user2來買票啦 user3來買票啦 user1來買票啦--出票 user0來買票啦--出票 user2來買票啦--出票 user3來買票啦--出票 線程里鎖的機制: 應用程序的最小單位是線程,他們共用這個應用程序里的資源,如果同時對某個數據進行修改的話,就會產生臟數據 解決:鎖? #!/usr/bin/env python
# -*- coding:utf-8 -*-
import threading,queue,time
q=queue.Queue(5)
def producter(user):
print("%s來買票啦" % user)
q.put("%s來買票啦" % user)
num=12
def consumer(lock):
global num
lock.acquire() #上鎖
who=q.get()
num-=1
time.sleep(2)
print(who + "--出票","剩余票數:%d" % num)
lock.release() #開鎖
for i in range(4):
user="user" + str(i)
t=threading.Thread(target=producter,args=(user,))
t.start()
#lock=threading.Lock()
lock=threading.RLock() #構建鎖對象 Lock只能加一重鎖 RLock可以加多重鎖
while True:
t1=threading.Thread(target=consumer,args=(lock,))
t1.start() user0來買票啦 user1來買票啦 user2來買票啦 user3來買票啦 user0來買票啦--出票?剩余票數:11 user1來買票啦--出票?剩余票數:10 user2來買票啦--出票?剩余票數:9 user3來買票啦--出票?剩余票數:8 #lock=threading.Lock()
#lock=threading.RLock() #構建鎖對象 Lock只能加一重鎖 RLock可以加多重鎖
lock=threading.BoundedSemaphore(2) #上面兩種鎖都是每次放行1個線程,這個可放行多個 一次放行2個線程 #!/usr/bin/env python
# -*- coding:utf-8 -*-
import threading
def func(i,event):
print(i)
event.wait() #監測是什么燈,紅燈停綠燈行
print(i+100)
event=threading.Event() #信號 收到信號就放行所有線程
for i in range(4):
t=threading.Thread(target=func,args=(i,event,))
t.start()
event.clear() #設置成紅燈
inp=input(">>>:")
if inp == "1":
event.set() #設置成綠燈 0 1 2 3 >>>:1 100 101 102 103
線程池: #!/usr/bin/env python
# -*- coding:utf-8 -*-
import queue,threading,time
class ThreadPool:
def __init__(self,maxsize=5):
self.maxsize=maxsize
self._q=queue.Queue(maxsize)
for i in range(maxsize):
self._q.put(threading.Thread)
def get_thread(self):
return self._q.get()
def add_thread(self):
self._q.put(threading.Thread)
pool=ThreadPool(5)
def task(args,p):
print(args)
time.sleep(2)
p.add_thread()
for i in range(10):
t=pool.get_thread()
obj = t(target=task,args=(i,pool,))
obj.start() 3個缺點: 1.? 進程: 共享空間: #!/usr/bin/env python
# -*- coding:utf-8 -*-
from multiprocessing import Process
from multiprocessing import queues
import multiprocessing
from multiprocessing import Manager
def foo(i,args):
args[i]=i+100
print(args.values())
if __name__ == "__main__":
obj=Manager()
li=obj.dict()
for i in range(5):
p = Process(target=foo,args=(i,li,))
p.start()
import time
time.sleep(2) [101] [101,?102] [101,?102,?103] [100,?101,?102,?103] [100,?101,?102,?103,?104]
轉載于:https://www.cnblogs.com/meitangyanyan/p/5697959.html
總結
以上是生活随笔為你收集整理的python成长之路11的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: etxabarri ibiña (ala
- 下一篇: 扩展KMP模板