python線程與進程

來源:互聯網
上載者:User

標籤:守護線程   資料互動   embed   運行   header   llb   can   tom   ict   

python線程與進程(process)

進程:資源的集合,本身不執行
線程:一串指令

線程共用記憶體,進程獨立記憶體,進程啟動慢,線程啟動快,線程之間資料可以交流,進程之間資料不可以交流。

守護進程

正常情況主線程與子線程沒有依賴關係,程式執行,你走我也走。子子線程裡使用join方法,使主線程等待子線程執行完畢後才執行。子線程設定setDaemon(True)把當前線程設定成守護線程,該線程就不重要了,一定在start之前設定。 python解譯器同一時段只允許存取一個線程

GIL鎖(全域解譯器鎖)

解譯器出口控制,同一時間只有一個線程可以工作。其餘線程等著。啟動的線程實實在在在CPU上了,但同一時間只有一個線程可以拿到資料。全域解譯器鎖。

線程鎖(互斥鎖)

threading.Lock() lock.acquire() lock.release()

遞迴鎖

threading.RLock() 多個門被鎖,鑰匙識別不出哪個對應的門

semaphore(訊號量)

semaphore=threading.BoundedSemaphore(5)#最多允許5個線程同時運行
semaphore.acquire() lock.release() 控制同一時刻允許有多少個線程可以執行,執行個體,線程池,進程池

Event

event=threading.Event()
event.wait()
event.set()
event.clear()
author = ‘Mr.Bool‘
import time
import threading
event=threading.Event()
def lighter():
count=0
event.set()
while True:
if count>5 and count<10:
event.clear()#變紅燈
print("紅燈")
elif count>10:
event.set()#變綠燈
print("變綠燈")
count=0
else:
print("現在是綠燈")
time.sleep(1)
count+=1


def car(name):
while True:
if event.is_set():
print("%s 可以通行"%name)
else:
print("%s 不可通行"%name)
event.wait()
time.sleep(1)
t1=threading.Thread(target=lighter)
t1.start()
t2=threading.Thread(target=car,args=(‘Benz‘,))
t2.start()
隊列

優點:解耦高效
queue.Queue()先進先出
queue.LifoQueue()後進先出買水果
queue.PriorityQueue()儲存資料時可以設定優先權
put(位置,資料)#put(1,‘wj‘)放置資料在第一位

    author = ‘Mr.Bool‘
import queue
import time
import threading
q=queue.Queue()
def Proceder():
count =0
while True:
q.put("骨頭%s"%count)
print("生產了骨頭%s"%count)
count+=1
time.sleep(1)
def eat(name):
while True:
g=q.get()
print("%s ear %s"%(name,g))
time.sleep(0.3)


p=threading.Thread(target=Proceder)
p.start()
d1=threading.Thread(target=eat,args=(‘wangwang‘,))
d1.start()
d2=threading.Thread(target=eat,args=(‘wangcai‘,))
d2.start()
多進程

import multiprocessing
在multiprocessing裡存在Process,Pool,Queue,Pipe,Manager
Process啟動進程
Pool建立進程池使用Pool時一定先close(),後join()
Queue資料互動
Pipe管道資料互動
Manager資料互動共用,可建立dict,list等進行共用使用執行個體:
1. process

import multiprocessing
import time,threading
import os
def threadingrun(name):
# print("%s is a big man"%name)
pass
def run(name):
print("now pid:%s"%os.getpid())
print("parent pid:%s"%os.getppid())
t=threading.Thread(target=threadingrun,args=(name,))
t.start()
if __name__ == ‘__main__‘:
for i in range(10):
p1=multiprocessing.Process(target=run,args=("wj",))
p1.start()
  1. poll
    from multiprocessing import Pool
    import os
    import time
    def processingtest(s):
    time.sleep(2)
    print("in process",os.getpid())
    return s+100
    def Bar(arg):
    print(‘-->exec done:‘,arg,os.getpid())
    pass
    if name=="_main":
    pool=Pool(3)
    print("主進程")
    for i in range(10):
    pool.apply
    async(func=processingtest,args=(i,),callback=Bar)
    print(‘end‘)
    pool.close()
    pool.join()
  2. Queue:

    from multiprocessing import Process,Queue,Pipe,Manager
    def processingtest(s):
    s.put([32,‘hello‘])
    print(‘子進程‘,s.get())


    if name=="__main":
    parent
    pipe,child
    pipe=Pipe()
    q=Queue()
    p=Process(target=processingtest,args=(q,))
    p.start()
    print(‘父進程‘,q.get())

  3. Pipe:
    from multiprocessing import Process,Queue,Pipe,Manager
    def processingtest(childpipe):
    child
    pipe.send("hello parent")
    print(childpipe.recv())
    if name=="
    main":
    parent
    pipe,child
    pipe=Pipe()
    p=Process(target=processingtest,args=(child
    pipe,))
    p.start()
    print(parentpipe.recv())
    parent
    pipe.send("hello son")
  4. Manager:
    from multiprocessing import Process,Manager
    import os
    def processingtest(d,l):
    d[os.getpid()]=os.getpid()
    l.append(os.getpid())
    pass
    if name=="_main": with Manager() as manager:
    d=manager.dict()
    l=manager.list()
    obj
    list=[]
    for i in range(10):
    p=Process(target=processingtest,args=(d,l))
    p.start()
    obj
    list.append(p)
    for i in range(10):
    obj
    list[i].join()
    print(d)
    print(l)

python線程與進程

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.