日本伊方核電廠機組 法院裁定重啟運轉

摘錄自2018年9月25日中央社報導

日本伊方核電廠三號機組去年底被廣島高等法院做出假處分裁定而持續停止運轉,但四國電力公司提出異議要求撤銷假處分,廣島高院今天(25日)撤銷原裁定,三號機組可重啟運轉。

根據日本讀賣新聞、日本放送協會(NHK)及日本經濟新聞等報導,目前由民眾提出聲請禁止三號機組運轉的假處分,還有高松高等法院、大分地方法院及山口地方法院岩國支部等正在審理,其中大分地方法院將在28日做出裁定。

因此,廣島高院今天撤銷假處分裁定後,三號機組雖然暫時又可重啟運轉,但未來視其他法院裁定結果,仍存在立刻停止運轉的可能性。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

※專營大陸快遞台灣服務

台灣快遞大陸的貨運公司有哪些呢?

統達能源宣布進軍中國大陸電動車市場

台灣統振集團旗下統達能源宣布,將聯合易能電網科技以及中國機車公司奔馬實業,共同進軍中國大陸電動車市場,以電動機車用鋰電池交換系統搶攻中國商機,最快將在2016年下半年於廣東、福建地區成立營運示範據點。

統達能源過去著重歐洲電動自行車店員市場開發,在歐洲已有10%市占率,本次為首度跨入電動機車電源的供應鏈。總經理楊模樺表示,合作夥伴易能電網科技整合了桶達的動力電池系統與台灣IBM的技術,打造「MIT(台灣製造)」的智能化電池交換服務系統,並已在台灣搭配電動機車實際上路。

奔馬實業去年在中國大陸共生產了20萬輛機車,帶來10億元人民幣的營收。本次與統達能源的合作,聚焦在電動機車與電池交換站營運事業。奔馬實業董事長湛玉娟認為,車店分離電池月租致的商業模式能透過電池交換服務系統的管理與遠端監控來提高電池之可靠性、安全性、壽命,降低營運商維護成本,並與物聯網概念結合。她相信,合作夥伴易能的電池交換系統將有效改善中國大陸電動機車的能源供給問題,也能改善電池環保管理問題。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步”網站設計“幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※試算大陸海運運費!

Google、福特、沃爾沃、Uber等合作建立自動駕駛汽車聯盟

日前,Google 已經與福特,沃爾沃,Uber和Lyft合作建立一個自動駕駛汽車聯盟,將與立法者,監管機構協調工作,讓自動駕駛汽車產生安全性和社會效益。

Google 和福特這兩大有影響力的公司走到一起,絕對是自動駕駛汽車行業一大利好消息,它們的結盟,將引起監管部門的注意。現在,自動駕駛汽車行業廠商有技術和原型,進行了無數的試駕,同時也拿出了實際的自動駕駛汽車車型,但是不健全的法律和法規限制了自動駕駛汽車上路。

如果自動駕駛汽車撞向一座建築物或其它車輛,誰應該負責?是坐在車裡的乘客還是自動駕駛汽車廠商?這些類型的問題將由聯盟將與政策制定者進行處理。目前領導該聯盟的是美國國家公路交通安全管理局前官員大衛•斯特裡克蘭。這樣聯盟就可以從監管的角度來看待問題。

本站聲明:網站內容來源於EnergyTrend https://www.energytrend.com.tw/ev/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

※專營大陸快遞台灣服務

台灣快遞大陸的貨運公司有哪些呢?

django學習與實踐

Django簡介

​ Django是一個由Python寫成的開放源代碼的Web應用框架,它最初是被用來開發管理勞倫斯出版集團旗下的一些以新聞內容為主的網站,即CMS(內容管理系統)軟件。 並於2005年7月在 BSD 許可證下發布。這套框架是以比利時的吉普賽爵士吉他手 Django Reinhardt 來命名的。由於 Django 的是在一個快節奏的新聞編輯室環境下開發的,它的目的是使常見的 Web 開發任務,快速和容易。

Django官網:https://www.djangoproject.com/

Django中文網:https://www.django.cn

Django的框架模式

  • Django採用了MTV設計模式

    M Models 模型
    T Templates 模板
    V Views 視圖

Django是一個Web應用框架,他是如何處理請求和響應的

URL ( urls.py )請求調度,當有緩存頁面的時候直接返回內容。
視圖函數( view.py )執行所請求的操作,通常包括讀寫數據庫。
模型( models.py )定義了 Python 中的數據並與之交互。通常包含在一個關係數據庫( MySQL、PostgreSQL SQLite 等),其他數據存儲是可能的( XML、文本文件、LDAP、等)。
請求執行任務后,視圖返回一個 HTTP 響應對象(通常是經過數據處理的一個模板)。可選的:視圖可以保存一個版本的 HTTP 響應對象,返回攜帶一個時間戳,來告訴瀏覽器這個視圖的更新時間。
模板通常返回 HTML 頁面。Django 模板語言提供了 HTML 的語法及邏輯。

安裝

第一行和第三行都可以隨便使用

網絡不好用第三行

pip install Django==2.1
#用國內的鏡像網站,如下
pip install Django==2.1 -i https://pypi.douban.com/simple

導入Django模塊

import django
print(django.get_version())
#結果:
2.1

基本配置

常用命令

查看django版本
python -m django --version
#結果
2.1
創建項目命令,項目名稱是mysite
django-admin startproject mysite
創建應用程序命令,確保在manage.py文件時在同一個目錄
#如果我們在項目外面,先要進入項目里
cd mysite
#windows使用dir查看當前在哪裡,如果有manage.py就代表我們可以正確使用下面的命令
#創建應用程序
python manage.py startapp app01

啟動django

python manage.py runserver
#默認端口是8000
#使用上面的命令就可以了,下面不經常用
#改端口
python manage.py runserver 8080
#改訪問地址和端口
python manage.py runserver 0.0.0.0:8080

生成模型變化遷移文件

python manage.py makemigrations

運行模型遷移文件遷移到數據庫中

python manage.py migrate

創建管理用戶

python manage.py createsuperuser
user:輸入:admin
email:不寫也行
password:輸入:admin123
驗證password:輸入:admin123
 讓你確認:輸入:y
    

注:自動重新加載 runserver,根據需要開發服務器自動重新加載Python代碼為每個請求。您不需要重新啟動服務器代碼更改生效。然而,像添加文件某些操作不觸發重新啟動,所以你必須重新啟動在這些情況下的服務器。

基本目錄結構及作用:
mysite/ # 項目的容器,名字隨便起
manage.py # 命令行實用工具,以各種方式與該Django項目進行交互
mysite/ # 實際的Python項目
init.py # 空文件,導入不出錯
settings.py # 這個Django項目配置
urls.py # 這個Django項目的URL聲明; 一個Django驅動網站的“目錄”
wsgi.py # 一個入口點為WSGI兼容的Web服務器,以滿足您的項目

Django自帶數據庫,我們也可以選擇不更改,項目開發中一般會更改使用的數據庫,更改數據庫配置在settings.py文件里

由於Django內部連接MySQL時使用的是MySQLdb模塊

目前可以使用mysql來代替pymysql了

我們需要去下載mysql
pip install mysql

在settings中修改DATABASES

DATABASES = {
    'default'{
        'ENGINE':'django.db.backends.mysql',
        'NAME':'你的數據庫名稱',
        'USER':'你的用戶名',
        'PASSWORD':'你的密碼',
        'HOST':'127.0.0.1',
        'PORT':'3306',
    }           
}

模板

也在settings里修改,主要放html文件

TEMPLATE_DIRS = (
os.path.join(BASE_DIR,'templates'),
)

靜態文件

也在settings里修改,放css,js等文件

STATICFILES_DIRS = (
os.path.join(BASE_DIR,'static'),
)

路由系統

路由系統就像我們我們的書本的目錄,書本的目錄會告訴你那一頁是什麼,你翻到那一頁就能看到相關的文字,路由系統就是,你對這個路由系統里的一個url地址發起了請求,路由系統會到對應的views函數去進行相關的處理,即這個url要用某個指定的views函數去處理。

來看下示例,django是怎麼規定構造路由的

from app01 import views
urlpatterns = [
    path(r'^login$',views.LoginView),
    path(r'^register$',views.RegisterView),
]
from app1 import views
urlpatterns = [
url(r'^manage1/(\d)', views.manage1),
url(r'^manage2/(?P\w)/(?P\d)', views.manage2),
url(r'^manage3/(?P\w)', views.manage3,{'id':333}),]

注意:

url多傳一個參數,那views對應的函數就要多接收一個參數

要不然會報錯的

二級路由

如果映射url太多了,全寫在一個urls.py文件里顯得繁瑣,所以出現了二級路由

就是項目的urls.py文件負責接收客戶發過來請求它判斷你傳來的東西有沒有它下面應用里的urls.py文件里有沒有,如果有就告訴應用的的urls來接收,讓它去處理,沒有就給你報錯

一級路由寫法

項目的urls.py文件里

from django.urls import path, include
urlpatterns = [
    path(r'app01/',include('app1.urls'))
]

Django是如何處理一個請求的

當用戶請求從您的 Django 的網站頁面,這是該系統遵循以確定哪些 Python 代碼執行的算法:

Django 請求是 URL 配置模塊配置。通常通過值 ROOT_URLCONF 設置,但如果傳入 HttpRequest 對象具有 urlconf 屬性(由中間件設置),它的值將代替的可以使用 ROOT_URLCONF 的設置。
Django 的負載是 Python 模塊並尋找變量 urlpatterns。這是一個 django.conf.urls.url() 實例。
Django 的貫穿每個 URL 模式,從而,在所請求的 URL 匹配的第一個停止。
一旦某個正則表達式相匹配,就運行相對應的視圖函數(或基於類的視圖)。該視圖被傳遞以下參數:
HttpRequest 對象。
如果匹配的正則表達式沒有返回命名組,然後從正則表達式比賽是作為位置參數。
關鍵詞參數是由由正則表達式匹配的任何命名組,由指定的可選參數的任何覆蓋的 kwargs參數 django.conf.urls.url()。
如果沒有正則表達式匹配,或者如果一個異常在這個過程中的任何一點時提出,Django的調用適當的錯誤處理視圖。

官方示例

from django.conf.urls import url

from . import views

urlpatterns = [
url(r'^articles/2003/$', views.special_case_2003),
url(r'^articles/([0-9]{4})/$', views.year_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/$', views.month_archive),
url(r'^articles/([0-9]{4})/([0-9]{2})/([0-9]+)/$', views.article_detail),]

注意事項:

要捕獲從URL中的值,用 括號括起來,會當參數傳入views視圖

沒有必要添加一個斜體,因為每個URL都有。例如,它^articles不是^/articles.

在‘r’前面的每一個正則表達式是可選的,建議,它告訴python字符串是原始的,沒有字符要轉義

舉例請求:

請求/articles/2005/03/將匹配列表中的第三項,Django將調用該函數。

views.month_archive(request,‘2005’,‘03’)

/articles/2005/3/ 不會匹配任何 URL 模式,因為在列表中的第三項中需要兩位数字的月份。

/articles/2003/ 將匹配的列表,而不是第二個第一圖案,因為該圖案,以便測試,第一個是在第一測

試通過。隨意利用順序插入特殊情況是這樣的。在這裏,Django的將調用該函數

views.special_case_2003(request)

/articles/2003 不匹配任何這些模式,因為每個模式要求 URL 以斜線結束。

/articles/2003/03/03/ 將匹配的最終格局。Django 的將調用該函數。

views.article_detail(request,’2003′, ’03’, ’03’)

命名組

上面的例子使用了簡單的,非命名的正則表達式組(通過括號)來捕獲URL的位,並通過他們的位置參數的視圖,在更高級的用法,它可以使用命名正則表達式組成來捕獲URL位,將它們作為關鍵字參數傳遞給視圖。

例子:

from django.conf.urls import url
from .import views
urlpatterns = [
    url(r'^articles/2003/$',views.special_case_2003),
    url(r'^articles/(?P[0-9]{4})/$',views.year_archive),
    url(r'^articles/(?P[0-9]{4})/(?P[0-9]{2})/$', views.month_archive),
    url(r'^articles/(?P[0-9]{4})/(?P[0-9]{2})/(?P[0-9]{2})/$',views.article_detail),
]

這正好完成同樣的事情,前面的例子,一個細微的差別:捕獲的值傳遞給查看功能作為關鍵字參數,而不是位置參數。例如:

請求/articles/2005/03/會調用函數來代替,views.month_archive(request, year=’2005′,month=’03’)views.month_archive(request, ‘2005’, ’03’)
請求/articles/2003/03/03/會調用該函數,views.article_detail(request, year=’2003′,month=’03’, day=’03’)
在實踐中,這意味着你的 URLconf 稍微更明確,不容易參數順序錯誤 – 你可以在你的意見’函數定義重新排序的參數。當然,這些優點來在簡短的費用; 一些開發任務命名組的語法醜陋,太冗長。

匹配/分組算法
這裏的URL配置解析器遵循算法,相對於正則表達式命名組與非命名組:

如果有任何命名參數,它會使用這些,而忽略非命名參數。
否則,它會通過所有非命名參數作為位置參數。
在這兩種情況下,被賦予按任何額外的關鍵字參數傳遞額外的選項來查看功能也將被傳遞給視圖請求/articles/2005/03/會調用函數來代替,views.month_archive(request,year=‘2005’,month=‘03’)

3> What the URLconf searches against
The URLconf searches against the requested URL, as a normal Python string. This does not include GET or POST parameters, or the domain name.

For example, in a request to https://www.example.com/myapp/, the URLconf will look for myapp/.

In a request to https://www.example.com/myapp/?page=3, the URLconf will look for myapp/.

該URL配置不看請求方法。換言之,所有的請求的方法,GET,POST 等將被路由到為相同的URL,相同的功能。

4> 捕獲的參數總是字符串
每個捕獲的參數發送到視圖作為普通的 Python 字符串,無論什麼樣的匹配正則表達式匹配。

例如,在該URL配置行:

url(r’^articles/(?P[0-9]{4})/$’, views.year_archive),
…的 year參數傳遞給 views.year_archive()將是一個字符串,

不是一個整數,即使 [0-9]{4} 將只匹配整数字符串。

5> 指定view的默認設置
一個方便的技巧是你的觀點的論據指定默認參數。下面是一個例子的 RLconf 和看法:

urlconf

from django.conf.urls import url
from . import views
urlpatterns = [
    url(r'^blogs/$',views.page),
    url(r'blog/page(?P[0-9]+)/$',views.page),
]

views.py

def page(request,num='1'):
    '''
    處理語句塊
    '''

視圖層

對邏輯負責處理用戶的請求並返回相應,返回可以是HTML內容的網頁,或者重定向,或者錯誤,或者字典

每個應用都有views.py文件

返回快捷鍵功能

render()
render(request,template_name,context=None,content_type=None,status=None,using=None)[source]

結合給定的模板與一個給定的上下文,返回一個字典HttpRespone在渲染文本對象

所需的參數

template_name 一個模板的使用或模板序列名稱全稱。如果序列是給定的,存在於第一個模板將被使用。

可選參數

context 一組字典的值添加到模板中,默認情況下這是一個孔子點

content_type MIME類型用於生成文檔

status 為響應狀態代碼,默認值為200

using這個名字一個模板引擎將使用的模板

例子:

from django.shortcuts import render
def my_view(request):
    return render(request,'myapp/index.html',{'fpp','bar',},content_type='application/xhyml+xml')

重定向

redirect()

redirect(to,permanent=False,*args,**kwargs)[source]
默認情況下,為臨時重定向,通過permanent=True設置永久重定向

例子:

def my_view(request):
    ...
    return redirect('/some/url/')
def my_view(request):
    ...
obj = MyModel.opbjects.get(...)
return redirect(object,permanent=True)

請求和響應對象

django使用請求和響應對象在系統間傳遞狀態

當請求一個頁面時,django創建一個HttpRequest對象包含原數據的請求,然後django加載適當的視圖,通過HttpRequest作為視圖函數的第一個參數,每個視圖負責返回一個HttpResponse目標

HttpRequest對象

HttpRequest.scheme

一個字符串表示請求的計劃方案(HTTP或者HTTPS)

通常HttpRequest.path

一個字符串的完整路徑的請求

HTTPRequest.method

請求HTTP的方法,這裏保證要大寫

#偽代碼
if request.method == 'GET':
    '''
    執行業務代碼
    返回結果
    '''
    return HttpResponse('結果')
#業務邏輯:如果請求來的是GET,你返回個GET字符串
#真代碼
class GETView(objects):
    def getview(self,request):
        if request.method == 'GET':
            return HttpResponse('GET')
  
if request.method == 'GET':
    return HttpResponse('GET')
elif request.method == 'POST':
    return HttpResponse('POST')
elif request.method == 'PUT':
    return HttpResponse('PUT')
elif request.method == 'DELETE':
    return HttpResponse('DELETE')
else:
    return HttpResponse('來了老弟!')

字典包含所有給定的HTTP GET 參數對象

HttpRequest.GET

字典包含所有給定的HTTP POST 參數對象,提供請求包含表單數據

HttpRequest.POST

一個標準的python字典,包含所有的COOKIES,KEY和VALUES都是字符串

字典包含所有上傳的文件

HttpRequest.FILES

語法:

HttpRequest.FILES
filename #上傳的文件名
content_type #上傳文件的類型
content #上傳文件的內容

HttpRequest.META

一個標準的Python字典包含所有可用的HTTP頭,可用標題取決於客戶端和服務器。以下是例子

CONTENT_LENGTH 請求體的長度(一個字符串
CONTENT_TYPE 請求體的類型
HTTP_ACCEPT 為響應–可以接受的內容類型
HTTP_ACCEPT_ENCODING 接受編碼的響應
HTTP_ACCEPT_LANGUAGE 接受語言的反應
HTTP_HOST 客戶端發送的HTTP主機頭
HTTP_REFERER 參考頁面
HTTP_USER_AGENT 客戶端的用戶代理字符串
QUERY_STRING 查詢字符串,作為一個單一的(分析的)字符串
REMOTE_ADDR 客戶端的IP地址
REMOTE_HOST 客戶端的主機名
REMOTE_USER 用戶通過Web服務器的身份驗證
REQUEST_METHOD 字符串,如”GET”或”POST”
SERVER_NAME 服務器的主機名
SERVER_PORT 服務器的端口(一個字符串)

HttpResponse對象

對於HttpRequest 對象來說,是由django自動創建的,但是,HttpResponse 對象就必須我們自己創建。每個 view 請求處理方法必須返回一個 HttpResponse 對象。

HttpResponse 類在 django.http.HttpResponse

字符串使用:
典型的用法是通過頁面的內容,為一個字符串

for django.http import HttpResponse
response = HttpResponse("hello world")
response = HttpResponse("hello world",content_type="text/plain")

如果你想添加內容的增量

response = HttpResponse()
response.write("hello world")
response.write("你好")
#特性與方法:
HttpResponse.content
一個bytestring代表內容HttpResponse.charset

一個字符串的字符集表示的響應將編碼

HttpResponse.status_code

HTTP狀態代碼為響應碼

HttpResponse.streaming

這個屬性永遠為假,一般用於中間件

HttpResponse.closed

方法:

先寫的代碼,后寫的註釋

HttpResponse.__init__(content='',content_type=None,status=200,reason=None,charset=None)[source]
#實例化類自動執行的方法
HttpResponse.__setitem__(header,value)
#為給定值給定的標題名稱,都是字符串
HttpResponse.__delitem__(header)
#刪除標題的名稱,不區分大小寫
HttpResponse.__getitem__(header)
#獲取給定標題名稱。不區分大小寫。
HttpResponse.has_header(header)

#檢查是否具有給定名稱的一個標題
HttpResponse.setdefault(header, value)

#設置一個標題,除非它已經設置。
HttpResponse.set_cookie(key, value='', max_age=None, expires=None, path='/', domain=None, secure=None, httponly=False)

#設置一個cookie。參數跟標準庫的Cookie對象差不多
HttpResponse.set_signed_cookie(key, value, salt='', max_age=None, expires=None, path='/', domain=None, secure=None, httponly=True)

#加密cookice,可以用 HttpRequest.get_signed_cookie() 獲取,當然你也可以加鹽
HttpResponse.delete_cookie(key, path='/', domain=None)

#刪除Cookie與給定鍵。

#HttpResponse子類:
class HttpResponseRedirect[source]

構造函數的第一個參數是必需的路徑redirectto,這是一個完全合格的URL,一個合格的URL(https://www.baidu.com/搜索/),沒有一個絕對的路徑(例如:域搜索//),甚至是相對路徑(如‘/’),

optionalconstructor參數。請注意,這將返回一個HTTP狀態代碼302。
class HttpResponsePermanentRedirect[source]

像httpresponseredirect,但它返回一個永久重定向(HTTP狀態代碼301)而不是“發現”的重定向(狀態代碼302)
class HttpResponseNotModified[source]

構造函數不帶任何參數和NO含量應該被添加到這一反應。使用指定一個頁面沒有被modifiedsince用戶的最後一個請求(狀態代碼304)。
class HttpResponseBadRequest[source]

就像HttpResponse但使用400狀態碼
class HttpResponseNotFound[source]

就像HttpResponse但使用404狀態碼
class HttpResponseForbidden[source]

就像HttpResponse但使用403狀態碼
class HttpResponseNotAllowed[source]

像HttpResponse,但使用405狀態碼。第一argumentto構造函數要求准許清單的方法(如(get,后])
class HttpResponseGone[source]

就像HttpResponse但使用410狀態碼
class HttpResponseServerError[source]

就像HttpResponse但使用500狀態碼

模板層

作為一個Web框架,Django需要模板,模板包含所需的HTML輸出靜態部分以及動態內容插入。
模板的執行
from datetime import datetime
def current_datetime(request):
    now = datetime.datetime.now()
    html = "it is now %s" % now
    return HttpResponse(html)

from django import template
t = template.Templatge("my name is {{name}}")
c = template.Context({"name":"老王"})
print(t.render(c))


import datetime
from django import template
import DjangoDemo.settings
now = datetime.datetime.now()
fp = open(settings.BASE_DIR+"/templates/home/index.html")
t = template.Template(fp.read())
fp.close()
html = t.render(template.Context({'current_date':now}))
return HttpResponse(html)

from django.template.loader import get_template
from django.template import Context
from django.http import HttpResponse
import datetime
def current_datetime(request):
    now = datetime.datetime.now()
    t = get_template('current_datetime.html')
    html = t.render(Content({'current_date':now}))
    return HttpResponse(html)
reurn render_to_response("Account/login.html",data,context_instance=RequestContext(request))

模板語言

模板中也有自己的語言,該語言實現數據展示
{{item}}
{% for item in item_list %}
    {{item}}
{% endfor %}
forloop.counter
forloop.first
forloop.last
{% if ordered_warranty %}
    {% else %}
{% endif %}
母板:{% block title %}{% endblock %}
子板: {% extends"base.html" %}
幫助方法:
{{ item.event_start|date:"Y-m-d H:i:s"}}
{{ bio|truncatewords:"30" }}
{{ my_list|first|upper }}
{{ name|lower }}

自定義simple_tag

在app中創建templatetags模塊

創建任意名字的.py文件

!/usr/bin/env python
coding:utf-8

from django import template
from django.utils.safestring import makesafe
from django.template.base import resolve_variable,Node,TemplateSyntaxError
register = template.Libary()
@register.simple_tag
def my_simple_time(a1,a2,a3):
    return a1+a2+a3
@register.simple_tag
def my_input(id,arg):
    result = "    "%(id,arg)
    return mark_safe(result)

在使用自定義simple_tag的html文件中導入之前創建任意名字的.py文件

{% load xx %}
//使用simple_tag
{% my_simple_time 123 %}

在settings中配置當前app,不然django無法找到自定義的simple_tag

INSTALLED_APPS = (
'django.contrib.admin',
'django.contrib.auth',
'django.contrib.contenttypes',
'django.contrib.sessions',
'django.contrib.messages',
'django.contrib.staticfiles',
'app01',
)

Models層

Django提供了一個抽象層(Model)的構建和管理Web應用程序的數據

每個模型是一個python類,子類 django.db.models.model

模型中的每個屬性代表數據庫中的一個字段。

例子:

from django.db import models
class Person(models.Model):
    first_name = models.CharField(max_length=30)
    last_name = models.CharField(max_length=30)

參數與字段

models.AutoField
#自增=int(11),如果沒有的化,默認會生成一個名稱為id的列,如果要显示的自定義的一個自增列,必須將給列設置為主鍵,主鍵設置方式:primary_key=True
models.CharField
#字符串字符段,必須有max_length參數
models.BooleanField
#布爾類型=tinyint(1),不能為空,Blank=True
models.ComaSeparatedlntegerField
#用逗號分隔的数字=varchar,繼承CharField,所以必須max_length參數
models.DateField
#日期類型 date,對於參數,auto_now=True則每次更新都會更新這個事件,auto_now_add則只是第一次創建添加,之後的更新不再改變
models.DateTimeField
#日期類型 datetime 同DateField參數一樣
models.Decimal
#十進制小數類型=decimal,必須制定整數位max_digits和小數位decimal_places
models.EmailField
#字符串類型(正則表達式郵箱)=varchar,對字符串進行正則表達式
models.FloatField
#浮點類型=double
models.IntegerField
#整型
models.BigIntegerField
#長整型
integer_field_ranges = {
    'SmallIntegerField': (-32768, 32767),
    'IntegerField': (-2147483648, 2147483647),
    'BigIntegerField': (-9223372036854775808, 9223372036854775807),
    'PositiveSmallIntegerField': (0, 32767),
    'PositiveIntegerField': (0, 2147483647),
  }
models.IPAddressField
#字符串類型(ipv4正則表達式)
models.GenericIPAddressField
#字符串類型(ipv4和ivp6是可選的),參數protocol可以是:both、ipv、ipv6,驗證時,會根據設置報錯
models.NullBooleanField
#允許為空的布爾類型
models.PositivenlntegerField
#正integer
models.PositiveSmallIntegerField
#正smallinteger
models.SlugField
#減號、下劃線、字母、数字
models.SmallInterField
#数字,數據庫中的字段有:tinyint、smallint、int、bigint
models.TextField
#字符串=longtext
models.TimeField
#時間 HH:MM[:ss[.uuuuuuu]]
models.URLField
#字符串,地址正則表達式
models.BinaryField
#二進制
models.ImageField
#圖片
models.FilePathField
#文件
null=True
#數據庫中字段是否可以為空
blank=True
#django的Admin中添加數據是是否允許空值
primary_key=False
#主鍵,對AutoField設置主鍵后,就會代替原來的自增id列
auto_now
#自動創建,無論添加或修改,都是當前操作的時間
auto_now_add
#自動創建愛你,永遠是創建時的時間
choices
#choices例子
GENDER_CHOICE = (
(u'M',u'Male'),
(u'F',u'Female'),
)
gender = models.CharField(max_length=2,choices=GENDER_CHOICE)
max_length
default
#默認值
verbose_name
#Admin中字段的显示名稱
nameidb_column
#數據庫中的字段名稱
unique=True
#不允許重複
db_index=True
#數據庫索引
editable=True
#在Admin里是否可編輯
error_messages=None
#錯誤提示
auto_created=False
#自動創建

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步”網站設計“幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※試算大陸海運運費!

抽象工廠–設計模式

前面工廠方法模式中考慮的是一類產品的生產, 如畜牧場只管動物、電視機廠只產電視機等.

同種類稱為同等級, 也就是說,工廠方法模式只會考慮生產同等級的產品,但是在現實生活中許多工廠都是綜合性很強的,也會加大工廠的最大使用效率,能夠生產出多等級的產品. 畜牧場可以養動物,也可以養植物等.

本篇博客將講述抽象工廠方法模式.抽象工廠模式將考慮多等級的產品同時生產,將處於同一個具體工廠所生產的不同等級的產品作為一個產品族. 

模式的定義與特點

定義

是一種為訪問類創建一組相關或者相互依賴的接口,並且訪問類不需要制定所要的產品的具體類就可以得到同族不同等級的產品模式結構.

抽象工廠模式一般都是工廠模式的升級, 工廠模式只生產一個等級的產品,而抽象工廠模式可生產多個等級的產品.

特點

使用抽象工廠模式一般要滿足如下條件.

  • 系統中有許多個產品族,每個具體工廠創建統一族但又屬於不同等級結構的產品.

抽象工廠有工廠模式的優點之外,還主要有以下優點:

  • 可在類的內部對產品族中相關聯的等級產品進行共同管理,並且不需要引入多個類來進行管理.
  • 當增加一個產品族時,不需要更改原來的代碼,滿足了開閉原則.

抽象工廠缺點:

  • 當產品族中需要增加新的產品時,所有的工廠類都需要更改

 

模式的結構和實現

抽象工廠和工廠方法一樣,都是由抽象工廠、具體工廠、抽象產品和具體產品4個要素組成,但是抽象工廠中方法個數有所不同,抽象的產品也會有不同.

結構:

模式的主要角色如下:

  1. 抽象工廠: 提供了創建產品的接口,包含了多個創建產品的方法,也可以創建多個不同等級的產品.
  2. 具體工廠: 實現抽象工廠的多個抽象方法, 完成具體產品的創建.
  3. 抽象產品: 定義了產品規範, 描述產品的主要特性和功能, 抽象工廠模式有多個的抽象產品.
  4. 具體產品: 實現了抽象產品定義的接口, 具體工廠來創建, 同具體工廠的關係是多對一.

結構圖如下:

模式的實現

上面的圖可發現,抽象工廠和工廠方法有些類似,不同的是產品種類不止一個, 所以創建產品方法也不止一個.

抽象工廠: 提供了產品的生產方法

interface AbstractFactory
{
    public Product1 newProduct1();
    public Product2 newProduct2();
}

具體工廠: 實現產品的生產

class ConcreteFactory1 implements AbstractFactory
{
    public Product1 newProduct1()
    {
        System.out.println("具體工廠 1 生成-->具體產品 11...");
        return new ConcreteProduct11();
    }
    public Product2 newProduct2()
    {
        System.out.println("具體工廠 1 生成-->具體產品 21...");
        return new ConcreteProduct21();
    }
}

 

模式應用實例 

[例1] 抽象工廠設計牧場類.

分析: 農場除了畜牧業可以養動物,也可以養植物,並且也可以種其他的.

抽象工廠模式設計兩個牧場, 一個農場用於養牛和種菜 ,一個用於養馬和種水果.

可以在兩個農場定義生成動物的方法和培養植物的算法.

設計如下結構圖:

代碼如下:

//抽象產品:動物類
interface Animal
{
    public void show();
}

//具體產品:馬類
class Horse implements Animal
{

    public void show()
    {
        jf.setVisible(true);
    }
}

//具體產品:牛類
class Cattle implements Animal
{
   
    public void show()
    {
        jf.setVisible(true);
    }
}

//抽象產品:植物類
interface Plant
{
    public void show();
}
//具體產品:水果類
class Fruitage implements Plant
{    
    public void show()
    {
        jf.setVisible(true);
    }
}
//具體產品:蔬菜類
class Vegetables implements Plant
{
    public void show()
    {
        jf.setVisible(true);
    }
}
//抽象工廠:農場類
interface Farm
{
    public Animal newAnimal();
    public Plant newPlant();
}
//具體工廠:農場類1
class SGfarm implements Farm
{
    public Animal newAnimal()
    {
        System.out.println("新牛出生!");
        return new Cattle();
    }
    public Plant newPlant()
    {
        System.out.println("蔬菜長成!");
        return new Vegetables();
    }
}
//具體工廠:農場類2
class SRfarm implements Farm
{
    public Animal newAnimal()
    {
        System.out.println("新馬出生!");
        return new Horse();
    }
    public Plant newPlant()
    {
        System.out.println("水果長成!");
        return new Fruitage();
    }
}

 

模式的應用場景

抽象工廠模式一般適用於如下場景:

  1. 當需要創建的對象是一系列的相互關聯或者依賴的產品族時. 例如工廠中的電視機,收音機以及空調等
  2. 系統有多個產品族, 但每次只使用其中的某一族產品時. 如有人只希望某種品牌的衣服和鞋子
  3. 系統提供了產品的類庫, 所有產品的接口都相同. 

模式的拓展:

  1. 當增加了一個新的產品族時只需要增加一個新的具體實現工廠,不需要更改原來的代碼,滿足了開閉原則
  2. 當產品族需要增加一個新種類的產品時, 所有的工廠類都需要更改,不符合開閉原則
  3. 當只存在了一個等級結構的產品時,也就退化到了工廠模式的結構.

 

以上就是抽象工廠的理論和實踐模式的內容,希望對大家有所幫助!!!

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理
【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

※專營大陸快遞台灣服務

台灣快遞大陸的貨運公司有哪些呢?

二、netcore跨平台之 Linux部署nginx代理webapi

上一章,我們講了在linux上安裝netcore環境,以及讓netcore在linux上運行。

這一章我們開始講在linux上配置nginx,以及讓nginx反向代理我們的webapi。

什麼nginx???

Nginx(“engine x”)是一款是由俄羅斯的程序設計師Igor Sysoev所開發高性能的 Web和 反向代理 服務器,也是一個 IMAP/POP3/SMTP 代理服務器。

在高連接併發的情況下,Nginx是Apache服務器不錯的替代品,而且現在越來越多的公司都開始用nginx,學習nginx是程序員必不可少的一部分。

 

現實用xshell登錄到我們的linux系統中。

輸入如下命令

安裝編譯工具和對應的庫文件,輸入下面的命令,回車即可

yum -y install make zlib zlib-devel gcc-c++ libtool  openssl openssl-devel

如下圖示,就表示安裝好了。

 

 

接下來,我們正式安裝Nginx,我們這次選擇安裝1.6.2版本。

(1)下載nginx,輸入下面命令,回車即可。

wget http://nginx.org/download/nginx-1.6.2.tar.gz

nginx比較小,下載起來還是蠻快的,如下圖所示,表示下載完成。

 

 

 

 (2)解壓nginx壓縮包

tar zxvf nginx-1.6.2.tar.gz

(3)進入到nginx目錄中

cd nginx-1.6.2

(4)編譯和安裝,分別執行下面的命令

./configure --prefix=/usr/local/nginx
make

 

 

 (5)查看版本

/usr/local/nginx/sbin/nginx -v

看到下面這個表示成功了

(6)啟動nginx

 

/usr/local/nginx/sbin/nginx

然後在你的電腦上用瀏覽器訪問即可

注意這裏的默認監聽端口是80,所以輸入ip加上80端口即可

出現如下這種視圖就表示成功了。

 

 

 

 

接下來就是很關鍵的配置了,其實安裝還是很簡單的。

 進入到你的nginx的安裝目錄下

分別輸入如下命令,即可查看到您的配置信息

cd  /usr/local/nginx/conf
ll

 

編輯您的nginx.conf文件,我這裏用vim進行編輯

vim nginx.conf

出現如圖所示:

 我們主要看如下圖所示紅色標記的部分

 

 

listen:表示當前的代理服務器監聽的端口,默認的是監聽80端口。注意,如果配置了多個server,這個listen要配置不一樣。

server_name:表示監聽到之後需要轉到哪裡去,這時我們直接轉到本地,這時是直接到nginx文件夾內。

location:表示匹配的路徑,這時配置了/表示所有請求都被匹配到這裏

root:裏面配置了root這時表示當匹配這個請求的路徑時,將會在這個文件夾內尋找相應的文件,這裏對我們之後的靜態文件伺服很有用。

index:當沒有指定主頁時,默認會選擇這個指定的文件,它可以有多個,並按順序來加載,如果第一個不存在,則找第二個,依此類推。

然後我們把上面的location進行了修改

用鍵盤的上下左右鍵把光標移動到如下位置

 

然後輸入鍵盤的 i(鍵盤的字母i)進入到編輯模式(這裡是給不懂linux說的,懂得人請無視)

然後用鍵盤的退回 ←把這裏的都刪除

 

 然後在輸入  proxy_pass http://localhost:6666;(這裏接上一章已經配置好的netcore webapi)

 

 

 然後點擊鍵盤的ESC退出編輯狀態

然後輸入:wq退出並保存

:wq

 

 這樣就保存配置結束了,conf配置其實很複雜,網上有很多根據不同需求進行的配置

大家有興趣可以去看看,我這裏只說入門的部分,額,其實入門都算不上,能用就行,哈哈哈

最後執行下面兩個命令

這裡是檢查配置

/usr/local/nginx/sbin/nginx -t

 

 最後一個就是重啟運行nginx

/usr/local/nginx/sbin/nginx -s reload

 

 

哦,最後我們看看效果,額

這裏一定不要忘記啟動我的netcore程序了

輸入命令進入到我們的項目中

cd /root/netcore/

然後輸入啟動程序的命令

dotnet WebApiTest.dll

如下圖所示,就表示啟動成功了

 

 

 

 然後,我們用測試工具測試一下我們的接口

如圖所示,我們把以前的6666接口換成了80端口,這裏還是訪問成功了,這就表示我們的nginx代理成功了

 

 

 

 

 

到這裏就基本結束了,不過大家一定有個奇怪的地方每次啟動netcore,每次關了你的xshell后就不能訪問了,

這裏建議使用下面的命令,使之成為後台進程即可

nohup dotnet  WebApiTest.dll  &

over !!!!!!!!!!!!!!!!!!!!!!!!

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

大陸寄台灣空運注意事項

大陸海運台灣交貨時間多久?

※避免吃悶虧無故遭抬價!台中搬家公司免費估價,有契約讓您安心有保障!

遏制空污 新德里裝空污預警系統

摘錄自2018年10月2日中央社新德里報導

印度新德里空氣污染嚴重程度經常位居世界前幾名,新德里高層官員表示,2018年在進入空污嚴重的冬天前,空污預警系統即將啟用,預計在10月底或11月初安裝,可預測兩天後的空氣品質,以提前遏制空污。

空污系統安裝好後,將從印度中央污染控制局(Central Pollution Control Board,CPCB)、德里污染控制委員會(Delhi Pollution Control Committee)和空氣品質及天氣預測與研究系統機構(System of Air Quality & Weather Forecasting and Research,SAFAR)旗下的36個空氣品質監測站獲得數據,同時從美國國家航空暨太空總署(NASA)衛星獲取即時氣候資料,綜合研判後,對空氣品質進行預測。

協助這項預警系統設置的印度熱帶研究所普恩分所(Indian Institute of Tropical Meteorology-Pune)科學家谷德表示,系統安裝後的第一年,僅空污濃度指標PM2.5(細懸浮微粒)數據被輸入系統,未來幾年將把PM10、二氧化硫(SO2)、二氧化氮(NO2)濃度等數據都納入系統,使空污預測更加準確。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步”網站設計“幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※試算大陸海運運費!

老舊柴油車釀空污 德國將提因應計畫

摘錄自2018年10月2日中央社柏林報導

德國政府2日將針對車齡較老、污染較嚴重的柴油車的未來發展方向,向數以百萬計車主提出妥協方案,而汽車製造商可能因為廢氣排放造假醜聞引發危機,而面臨嚴苛責罰。

德國總理梅克爾(Angela Merkel)和主要部門首長商議至1日深夜後,她領導的保守派基民/基社聯盟(CDU/CSU)和中間偏左執政聯盟夥伴社會民主黨(SPD)公布了「潔淨空氣和確保我國都市機動性的概念」。這起柴油高峰會目的在於清除都市空汙,同時避免車主支出額外費用。

漢堡(Hamburg)和斯圖加特(Stuttgart)等主要城市的某些地區不歡迎老舊柴油車,法院也逐漸對其他地區祭出禁令。交通部長舒爾(Andreas Scheuer)在會議開始前告訴德新社(DPA),最重要的是,「我們希望避免進一步祭出駕駛禁令」。不過,汽車製造商可能面臨嚴峻懲罰,環境部長舒爾茨(Svenja Schulze)強調,是「汽車業把我們捲進麻煩中,應該為此付出代價」。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※為什麼 USB CONNECTOR 是電子產業重要的元件?

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想要讓你的商品成為最夯、最多人討論的話題?網頁設計公司讓你強力曝光

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

※專營大陸快遞台灣服務

台灣快遞大陸的貨運公司有哪些呢?

打擊非法交易 緬甸公開銷毀走私象牙虎骨

摘錄自2018年10月4日中央社報導

路透社報導,緬甸當局4日銷毀查獲的數以百計象牙、穿山甲鱗片和其他動物部位,總重量超過1.4公噸,黑市價格達到130萬美元(約新台幣4000萬元),作為政府打擊非法走私野生生物的一環。

緬甸位於全球非法野生生物交易的心臟地帶,大部分走私品銷往中國。緬甸、寮國和泰國的交界地區,就是惡名昭彰的「金三角」(Golden Triangle)。

保育團體「拯救大象」(Save the Elephants)本週提出的報告指出,中國近來推出的象牙交易禁令,幾乎無法阻止緬甸與中國邊界城鎮勐拉(Mong La)的交易「大量成長」。過去3年來,勐拉鎮出售新的象牙產品增加60%。

本站聲明:網站內容來源環境資訊中心https://e-info.org.tw/,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

網頁設計一頭霧水??該從何著手呢? 找到專業技術的網頁設計公司,幫您輕鬆架站!

※想知道最厲害的台北網頁設計公司推薦台中網頁設計公司推薦專業設計師”嚨底家”!!

大陸寄台灣空運注意事項

大陸海運台灣交貨時間多久?

※避免吃悶虧無故遭抬價!台中搬家公司免費估價,有契約讓您安心有保障!

Python多線程與隊列

Python多線程與Queue隊列多線程在感官上類似於同時執行多個程序,雖然由於GIL的存在,在Python中無法實現線程的真正并行,但是對於某些場景,多線程仍不失為一個有效的處理方法:

1,不緊急的,無需阻塞主線程的任務,此時可以利用多線程在後台慢慢處理;
2,IO密集型操作,比如文件讀寫、用戶輸入和網絡請求等,此時多線程可以近似達到甚至優於多進程的表現;

多線程的基本使用不再贅述,以下語法便可輕鬆實現:

1 def task(args1, args2):
2     pass
3 
4 Thread(
5     target=task,
6     args=(args1, args2)
7 ).start()

這裏我們重點關注線程通信。

假設有這麼一種場景:有一批源數據,指定一個操作係數N,需要分別對其進行與N的加減乘除操作,並將結果匯總。
當然這裏的加減乘除只是一種簡單處理,在實際的生產環境中,它其實代表了一步較為複雜的業務操作,並包含了較多的IO處理。

自然我們想到可以開啟多線程處理,那麼緊接着的問題便是:如何劃分線程,是根據處理步驟劃分,還是根據源數據劃分?

對於前者,我們把涉及的業務操作單獨劃分位一個線程,即有4個線程分別進行加減乘除的操作,顯然上一個線程的結果是下一個線程的輸入,這類似於流水線操作;

而後者則是把源數據分為若干份,每份啟動一個線程進行處理,最終把結果匯總。一般來說,我們推薦第一種方式。因為在一個線程中完成所有的操作不如每步一個線程清晰明了,

尤其是在一些複雜的場景下,會加大單個線程的出錯概率和測試難度。

那麼我們將開闢4個線程,分別執行加減乘除操作。最後一個除法線程結束則任務完成:

 

 1 #!/usr/bin/env python
 2 # -*- coding: utf-8 -*-
 3 
 4 from Queue import Queue
 5 from threading import Thread
 6 
 7 
 8 class NumberHandler(object):
 9     def __init__(self, n):
10         self.n = n
11 
12     def add(self, num):
13         return num + self.n
14 
15     def subtract(self, num):
16         return num - self.n
17 
18     def multiply(self, num):
19         return num * self.n * self.n
20 
21     def divide(self, num):
22         return num / self.n
23 
24 
25 class ClosableQueue(Queue):
26     SENTINEL = object()
27 
28     def close(self):
29         self.put(self.SENTINEL)
30 
31     def __iter__(self):
32         while True:
33             item = self.get()
34             try:
35                 if item is self.SENTINEL:
36                     return
37                 yield item
38             finally:
39                 self.task_done()
40 
41 
42 class StoppableWorker(Thread):
43     def __init__(self, func, in_queue, out_queue):
44         super(StoppableWorker, self).__init__()
45         self.in_queue = in_queue
46         self.out_queue = out_queue
47         self.func = func
48 
49     def run(self):
50         for item in self.in_queue:
51             result = self.func(item)
52             self.out_queue.put(result)
53             print self.func
54 
55 
56 if __name__ == '__main__':
57     source_queue = ClosableQueue()
58     add_queue = ClosableQueue()
59     subtract_queue = ClosableQueue()
60     multiply_queue = ClosableQueue()
61     divide_queue = ClosableQueue()
62     result_queue = ClosableQueue()
63 
64     number_handler = NumberHandler(5)
65 
66     threads = [
67         StoppableWorker(number_handler.add, add_queue, subtract_queue),
68         StoppableWorker(number_handler.subtract, subtract_queue, multiply_queue),
69         StoppableWorker(number_handler.multiply, multiply_queue, divide_queue),
70         StoppableWorker(number_handler.divide, divide_queue, result_queue),
71     ]
72 
73     for _thread in threads:
74         _thread.start()
75 
76     for i in range(10):
77         add_queue.put(i)
78 
79     add_queue.close()
80     add_queue.join()
81     print 'add job done...'
82     subtract_queue.close()
83     subtract_queue.join()
84     print 'subtract job done...'
85     multiply_queue.close()
86     multiply_queue.join()
87     print 'multiply job done...'
88     divide_queue.close()
89     divide_queue.join()
90     print 'divide job done...'
91     result_queue.close()
92 
93     print "%s items finished, result: %s" % (result_queue.qsize(), result_queue)
94 
95     for i in result_queue:
96         print i

運行結果:

線程執行日誌:

 

 

 總的結果:

 

 可見線程交叉運行,但是任務卻是順序結束,這符合我們的預期。

值得注意的是,我們在ClosableQueue定義了一個close()方法,通過放入一個特殊的類變量SENTINEL告訴隊列應該關閉。此外,由於直接加減乘除結果不變,因此我特意乘了兩次來便於我們判斷結果。

總結:

1. Queue是一種高效的任務處理方式,它可以把任務處理流程劃分為若干階段,並使用多條python線程來同時執行這些子任務;

2. Queue類具備阻塞式的隊列操作、能夠指定緩衝區尺寸,而且還支 持join方法,這使得開發者可以構建出健壯的流水線。

 

本站聲明:網站內容來源於博客園,如有侵權,請聯繫我們,我們將及時處理

【其他文章推薦】

※帶您來了解什麼是 USB CONNECTOR  ?

※自行創業 缺乏曝光? 下一步”網站設計“幫您第一時間規劃公司的門面形象

※如何讓商品強力曝光呢? 網頁設計公司幫您建置最吸引人的網站,提高曝光率!!

※綠能、環保無空污,成為電動車最新代名詞,目前市場使用率逐漸普及化

※廣告預算用在刀口上,網站設計公司幫您達到更多曝光效益

※試算大陸海運運費!