Python自學基礎訓練之佇列(二)

2021-10-01 13:31:00 字數 4311 閱讀 8870

這是另外一種形式表達方式,基本上學習完一種就可以了。

from  threading import thread

import queue#容器,也可以用陣列,列表,字典形式

import time

class producer(thread):#生產者其實這個threading.thread一樣的,只是他用了import模式

def __init__(self,name,queue):#寫簡單的,正常是用super繼承

self.__name=name#私有變數,生產者

self.__queue=queue#私有變數,容器

super(producer, self).__init__()

def run(self):

while true:

if self.__queue.full():#如果佇列滿了,則等待下一秒

time.sleep(1)

else:#如果沒滿,則生產乙個

self.__queue.put('baozi')

print('productor one more baozi')

#thread.run(self)#簡化可以不要,加上表示再執行原生的執行緒run

class consumer(thread):#消費者

def __init__(self,name,queue):#寫簡單的,正常是用super繼承

self.__name=name#私有變數,生產者

self.__queue=queue#私有變數,容器

super(consumer, self).__init__()

def run(self):

while true:

if self.__queue.empty():#如果為空,則等待一秒

time.sleep(1)

else:#如果不為空,則取出乙個

self.__queue.get()

print('consumer eat baozi')

#thread.run(self)

q=queue.queue(maxsize=100)

baogou1=producer('laogou1',q)

baogou1.start()

baogou2=producer('laogou2',q)

baogou2.start()

baogou3=producer('laogou3',q)

baogou3.start()

for item in range(20):

name='chentao%d'%(item)

print(name)

temp=consumer(name,q)

temp.start()

#簡單生產與消費者

import threading

import time

import queue

def producer(name,que):

que.put('baozi')#生產

print('%s made a baoz'% name)

def consumer(name,que):

que.get()#消費

print('%s got a baozi....'% name)

q=queue.queue()

p1=threading.thread(target=producer,args=('one',q))

p2=threading.thread(target=producer,args=('two',q))

p1.start()

p2.start()

c1=threading.thread(target=consumer,args=('c1',q))

c2=threading.thread(target=consumer,args=('c2',q))

c1.start()

c2.start()

#要是加了join,執行緒好像結束了

#簡單生產與消費者

import threading

import time

import queue

import random

def producer(name,que):

while true:

que.put('baozi')

print('%s made a baoz'% name)

time.sleep(random.randrange(5))

def consumer(name,que):

while true:

try:

que.get_nowait()

print('%s got a baozi....'% name)

except exception as e:

print('沒有包子了')

time.sleep(random.randrange(3))

q=queue.queue()

p1=threading.thread(target=producer,args=('one',q))

p2=threading.thread(target=producer,args=('two',q))

p1.start()

p2.start()

c1=threading.thread(target=consumer,args=('c1',q))

c2=threading.thread(target=consumer,args=('ccccccccc2',q))

c1.start()

c2.start()

#簡單生產與消費者,加強程式複雜度

import threading

import time

import queue

import random

def producer(name,que):

while true:

if que.qsize()<3:

que.put('baozi')

print('%s made a baoz'% name)

else:

print('還有三個包子 - -')

time.sleep(random.randrange(5))

def consumer(name,que):

while true:

try:

que.get_nowait()

print('%s got a baozi....'% name)

except exception as e:

print('沒有包子了')

time.sleep(random.randrange(3))

q=queue.queue()

p1=threading.thread(target=producer,args=('one',q))

p2=threading.thread(target=producer,args=('two',q))

p1.start()

p2.start()

c1=threading.thread(target=consumer,args=('c1',q))

c2=threading.thread(target=consumer,args=('ccccccccc2',q))

c1.start()

c2.start()

#多把鎖

import  threading

import time

num=0

num2=0

def run(n):

global num

global num2

time.sleep(0.1)

lock.acquire()#鎖只放在操作的時候,要是放在前面,就成了序列操作,即單執行緒

num+=1

lock.acquire()

num2+=1

lock.release()

lock.release()

time.sleep(0.01)

print(num)

lock=threading.rlock()#記住陣列,記住多把鎖,例如有2個acquire,必須有對應的2個releas,#工作少用, 單鎖用得多

for i in range(100):

t=threading.thread(target=run,args=(10,))

t.start()

Python自學基礎訓練之logging

之前是一直用print輸出,有點不方便,如果用logging的話,可以另外輸出,容易查詢問題點,如果之前不寫,後面再看起自己的 也需要花費好長時間。import logging logging.basicconfig level logging.debug,format asctime s file...

Python基礎訓練(一)

1.閏年判斷 給定乙個年份,判斷這一年是不是閏年。當以下情況之一滿足時,這一年是閏年 1 年份是4的倍數而不是100的倍數 2 年份是400的倍數。其他的年份都不是閏年。n int input if n 4 0 and n 100 0 print yes elif n 400 0 print yes...

Python基礎訓練(二)

1.楊輝三角 楊輝三角形又稱pascal三角形,它的第i 1行是 a b i的展開式的係數。它的乙個重要性質是 三角形中的每個數字等於它兩肩上的數字相加。下面給出了楊輝三角形的前4行 1 11 2 1 1 3 3 1 給出n,輸出它的前n行。輸入格式 輸入包含乙個數n。輸出格式 輸出楊輝三角形的前n...