成人午夜视频全免费观看高清-秋霞福利视频一区二区三区-国产精品久久久久电影小说-亚洲不卡区三一区三区一区

python里的阻塞函數(shù),Python 阻塞

python里并發(fā)執(zhí)行協(xié)程時(shí)部分阻塞超時(shí)怎么辦

在前面的例子里學(xué)習(xí)了并發(fā)地執(zhí)行多個(gè)協(xié)程來下載圖片,也許其中一個(gè)協(xié)程永遠(yuǎn)下載不了,一直阻塞,這時(shí)怎么辦呢?

創(chuàng)新互聯(lián)從2013年開始,先為巧家等服務(wù)建站,巧家等地企業(yè),進(jìn)行企業(yè)商務(wù)咨詢服務(wù)。為巧家企業(yè)網(wǎng)站制作PC+手機(jī)+微官網(wǎng)三網(wǎng)同步一站式服務(wù)解決您的所有建站問題。

碰到這種需求時(shí)不要驚慌,可以使用wait()里的timeout參數(shù)來設(shè)置等待時(shí)間,也就是從這個(gè)函數(shù)開始運(yùn)行算起,如果時(shí)間到達(dá)協(xié)程沒有執(zhí)行完成,就可以不再等它們了,直接從wait()函數(shù)里返回,返回之后就可以判斷那些沒有執(zhí)行成功的,可以把這些協(xié)程取消掉。例子如下:

[python]?view plain?copy

import?asyncio

async?def?phase(i):

print('in?phase?{}'.format(i))

try:

await?asyncio.sleep(0.1?*?i)

except?asyncio.CancelledError:

print('phase?{}?canceled'.format(i))

raise

else:

print('done?with?phase?{}'.format(i))

return?'phase?{}?result'.format(i)

async?def?main(num_phases):

print('starting?main')

phases?=?[

phase(i)

for?i?in?range(num_phases)

]

print('waiting?0.1?for?phases?to?complete')

completed,?pending?=?await?asyncio.wait(phases,?timeout=0.1)

print('{}?completed?and?{}?pending'.format(

len(completed),?len(pending),

))

#?Cancel?remaining?tasks?so?they?do?not?generate?errors

#?as?we?exit?without?finishing?them.

if?pending:

print('canceling?tasks')

for?t?in?pending:

t.cancel()

print('exiting?main')

event_loop?=?asyncio.get_event_loop()

try:

event_loop.run_until_complete(main(3))

finally:

event_loop.close()

結(jié)果輸出如下:

starting main

waiting 0.1 for phases to complete

in phase 0

in phase 2

in phase 1

done with phase 0

1 completed and 2 pending

canceling tasks

exiting main

phase 1 canceled

phase 2 canceled

python多進(jìn)程中隊(duì)列不空時(shí)阻塞,求解為什么

最近接觸一個(gè)項(xiàng)目,要在多個(gè)虛擬機(jī)中運(yùn)行任務(wù),參考別人之前項(xiàng)目的代碼,采用了多進(jìn)程來處理,于是上網(wǎng)查了查python中的多進(jìn)程

一、先說說Queue(隊(duì)列對(duì)象)

Queue是python中的標(biāo)準(zhǔn)庫,可以直接import 引用,之前學(xué)習(xí)的時(shí)候有聽過著名的“先吃先拉”與“后吃先吐”,其實(shí)就是這里說的隊(duì)列,隊(duì)列的構(gòu)造的時(shí)候可以定義它的容量,別吃撐了,吃多了,就會(huì)報(bào)錯(cuò),構(gòu)造的時(shí)候不寫或者寫個(gè)小于1的數(shù)則表示無限多

import Queue

q = Queue.Queue(10)

向隊(duì)列中放值(put)

q.put(‘yang')

q.put(4)

q.put([‘yan','xing'])

在隊(duì)列中取值get()

默認(rèn)的隊(duì)列是先進(jìn)先出的

q.get()

‘yang'

q.get()

4

q.get()

[‘yan', ‘xing']

當(dāng)一個(gè)隊(duì)列為空的時(shí)候如果再用get取則會(huì)堵塞,所以取隊(duì)列的時(shí)候一般是用到

get_nowait()方法,這種方法在向一個(gè)空隊(duì)列取值的時(shí)候會(huì)拋一個(gè)Empty異常

所以更常用的方法是先判斷一個(gè)隊(duì)列是否為空,如果不為空則取值

隊(duì)列中常用的方法

Queue.qsize() 返回隊(duì)列的大小

Queue.empty() 如果隊(duì)列為空,返回True,反之False

Queue.full() 如果隊(duì)列滿了,返回True,反之False

Queue.get([block[, timeout]]) 獲取隊(duì)列,timeout等待時(shí)間

Queue.get_nowait() 相當(dāng)Queue.get(False)

非阻塞 Queue.put(item) 寫入隊(duì)列,timeout等待時(shí)間

Queue.put_nowait(item) 相當(dāng)Queue.put(item, False)

二、multiprocessing中使用子進(jìn)程概念

from multiprocessing import Process

可以通過Process來構(gòu)造一個(gè)子進(jìn)程

p = Process(target=fun,args=(args))

再通過p.start()來啟動(dòng)子進(jìn)程

再通過p.join()方法來使得子進(jìn)程運(yùn)行結(jié)束后再執(zhí)行父進(jìn)程

from multiprocessing import Process

import os

# 子進(jìn)程要執(zhí)行的代碼

def run_proc(name):

print 'Run child process %s (%s)...' % (name, os.getpid())

if __name__=='__main__':

print 'Parent process %s.' % os.getpid()

p = Process(target=run_proc, args=('test',))

print 'Process will start.'

p.start()

p.join()

print 'Process end.'

三、在multiprocessing中使用pool

如果需要多個(gè)子進(jìn)程時(shí)可以考慮使用進(jìn)程池(pool)來管理

from multiprocessing import Pool

from multiprocessing import Pool

import os, time

def long_time_task(name):

print 'Run task %s (%s)...' % (name, os.getpid())

start = time.time()

time.sleep(3)

end = time.time()

print 'Task %s runs %0.2f seconds.' % (name, (end - start))

if __name__=='__main__':

print 'Parent process %s.' % os.getpid()

p = Pool()

for i in range(5):

p.apply_async(long_time_task, args=(i,))

print 'Waiting for all subprocesses done...'

p.close()

p.join()

print 'All subprocesses done.'

pool創(chuàng)建子進(jìn)程的方法與Process不同,是通過

p.apply_async(func,args=(args))實(shí)現(xiàn),一個(gè)池子里能同時(shí)運(yùn)行的任務(wù)是取決你電腦的cpu數(shù)量,如我的電腦現(xiàn)在是有4個(gè)cpu,那會(huì)子進(jìn)程task0,task1,task2,task3可以同時(shí)啟動(dòng),task4則在之前的一個(gè)某個(gè)進(jìn)程結(jié)束后才開始

上面的程序運(yùn)行后的結(jié)果其實(shí)是按照上圖中1,2,3分開進(jìn)行的,先打印1,3秒后打印2,再3秒后打印3

代碼中的p.close()是關(guān)掉進(jìn)程池子,是不再向里面添加進(jìn)程了,對(duì)Pool對(duì)象調(diào)用join()方法會(huì)等待所有子進(jìn)程執(zhí)行完畢,調(diào)用join()之前必須先調(diào)用close(),調(diào)用close()之后就不能繼續(xù)添加新的Process了。

當(dāng)時(shí)也可以是實(shí)例pool的時(shí)候給它定義一個(gè)進(jìn)程的多少

如果上面的代碼中p=Pool(5)那么所有的子進(jìn)程就可以同時(shí)進(jìn)行

三、多個(gè)子進(jìn)程間的通信

多個(gè)子進(jìn)程間的通信就要采用第一步中說到的Queue,比如有以下的需求,一個(gè)子進(jìn)程向隊(duì)列中寫數(shù)據(jù),另外一個(gè)進(jìn)程從隊(duì)列中取數(shù)據(jù),

#coding:gbk

from multiprocessing import Process, Queue

import os, time, random

# 寫數(shù)據(jù)進(jìn)程執(zhí)行的代碼:

def write(q):

for value in ['A', 'B', 'C']:

print 'Put %s to queue...' % value

q.put(value)

time.sleep(random.random())

# 讀數(shù)據(jù)進(jìn)程執(zhí)行的代碼:

def read(q):

while True:

if not q.empty():

value = q.get(True)

print 'Get %s from queue.' % value

time.sleep(random.random())

else:

break

if __name__=='__main__':

# 父進(jìn)程創(chuàng)建Queue,并傳給各個(gè)子進(jìn)程:

q = Queue()

pw = Process(target=write, args=(q,))

pr = Process(target=read, args=(q,))

# 啟動(dòng)子進(jìn)程pw,寫入:

pw.start()

# 等待pw結(jié)束:

pw.join()

# 啟動(dòng)子進(jìn)程pr,讀取:

pr.start()

pr.join()

# pr進(jìn)程里是死循環(huán),無法等待其結(jié)束,只能強(qiáng)行終止:

print

print '所有數(shù)據(jù)都寫入并且讀完'

四、關(guān)于上面代碼的幾個(gè)有趣的問題

if __name__=='__main__':

# 父進(jìn)程創(chuàng)建Queue,并傳給各個(gè)子進(jìn)程:

q = Queue()

p = Pool()

pw = p.apply_async(write,args=(q,))

pr = p.apply_async(read,args=(q,))

p.close()

p.join()

print

print '所有數(shù)據(jù)都寫入并且讀完'

如果main函數(shù)寫成上面的樣本,本來我想要的是將會(huì)得到一個(gè)隊(duì)列,將其作為參數(shù)傳入進(jìn)程池子里的每個(gè)子進(jìn)程,但是卻得到

RuntimeError: Queue objects should only be shared between processes through inheritance

的錯(cuò)誤,查了下,大意是隊(duì)列對(duì)象不能在父進(jìn)程與子進(jìn)程間通信,這個(gè)如果想要使用進(jìn)程池中使用隊(duì)列則要使用multiprocess的Manager類

if __name__=='__main__':

manager = multiprocessing.Manager()

# 父進(jìn)程創(chuàng)建Queue,并傳給各個(gè)子進(jìn)程:

q = manager.Queue()

p = Pool()

pw = p.apply_async(write,args=(q,))

time.sleep(0.5)

pr = p.apply_async(read,args=(q,))

p.close()

p.join()

print

print '所有數(shù)據(jù)都寫入并且讀完'

這樣這個(gè)隊(duì)列對(duì)象就可以在父進(jìn)程與子進(jìn)程間通信,不用池則不需要Manager,以后再擴(kuò)展multiprocess中的Manager類吧

關(guān)于鎖的應(yīng)用,在不同程序間如果有同時(shí)對(duì)同一個(gè)隊(duì)列操作的時(shí)候,為了避免錯(cuò)誤,可以在某個(gè)函數(shù)操作隊(duì)列的時(shí)候給它加把鎖,這樣在同一個(gè)時(shí)間內(nèi)則只能有一個(gè)子進(jìn)程對(duì)隊(duì)列進(jìn)行操作,鎖也要在manager對(duì)象中的鎖

#coding:gbk

from multiprocessing import Process,Queue,Pool

import multiprocessing

import os, time, random

# 寫數(shù)據(jù)進(jìn)程執(zhí)行的代碼:

def write(q,lock):

lock.acquire() #加上鎖

for value in ['A', 'B', 'C']:

print 'Put %s to queue...' % value

q.put(value)

lock.release() #釋放鎖

# 讀數(shù)據(jù)進(jìn)程執(zhí)行的代碼:

def read(q):

while True:

if not q.empty():

value = q.get(False)

print 'Get %s from queue.' % value

time.sleep(random.random())

else:

break

if __name__=='__main__':

manager = multiprocessing.Manager()

# 父進(jìn)程創(chuàng)建Queue,并傳給各個(gè)子進(jìn)程:

q = manager.Queue()

lock = manager.Lock() #初始化一把鎖

p = Pool()

pw = p.apply_async(write,args=(q,lock))

pr = p.apply_async(read,args=(q,))

p.close()

p.join()

print

print '所有數(shù)據(jù)都寫入并且讀完'

python wait()函數(shù)問題

看了你發(fā)的函數(shù):

def Wait(self):

self._app.MainLoop()

看名字應(yīng)該是啟動(dòng)了阻塞循環(huán),去處理app的請(qǐng)求,這個(gè)就是需要一直運(yùn)行的,因?yàn)橐坏┩V沽耍愕腶pp請(qǐng)求就沒發(fā)處理了。

如果你需要啟動(dòng)后再執(zhí)行的別的程序,可以使用多進(jìn)程,把這個(gè)啟動(dòng)放在別的進(jìn)程里去執(zhí)行。

如果解決了您的問題請(qǐng)采納!

如果未解決請(qǐng)繼續(xù)追問

python2.7怎么實(shí)現(xiàn)異步

改進(jìn)之前

之前,我的查詢步驟很簡單,就是:

前端提交查詢請(qǐng)求 -- 建立數(shù)據(jù)庫連接 -- 新建游標(biāo) -- 執(zhí)行命令 -- 接受結(jié)果 -- 關(guān)閉游標(biāo)、連接

這幾大步驟的順序執(zhí)行。

這里面當(dāng)然問題很大:

建立數(shù)據(jù)庫連接實(shí)際上就是新建一個(gè)套接字。這是進(jìn)程間通信的幾種方法里,開銷最大的了。

在“執(zhí)行命令”和“接受結(jié)果”兩個(gè)步驟中,線程在阻塞在數(shù)據(jù)庫內(nèi)部的運(yùn)行過程中,數(shù)據(jù)庫連接和游標(biāo)都處于閑置狀態(tài)。

這樣一來,每一次查詢都要順序的新建數(shù)據(jù)庫連接,都要阻塞在數(shù)據(jù)庫返回結(jié)果的過程中。當(dāng)前端提交大量查詢請(qǐng)求時(shí),查詢效率肯定是很低的。

第一次改進(jìn)

之前的模塊里,問題最大的就是第一步——建立數(shù)據(jù)庫連接套接字了。如果能夠一次性建立連接,之后查詢能夠反復(fù)服用這個(gè)連接就好了。

所以,首先應(yīng)該把數(shù)據(jù)庫查詢模塊作為一個(gè)單獨(dú)的守護(hù)進(jìn)程去執(zhí)行,而前端app作為主進(jìn)程響應(yīng)用戶的點(diǎn)擊操作。那么兩條進(jìn)程怎么傳遞消息呢?翻了幾天Python文檔,終于構(gòu)思出來:用隊(duì)列queue作為生產(chǎn)者(web前端)向消費(fèi)者(數(shù)據(jù)庫后端)傳遞任務(wù)的渠道。生產(chǎn)者,會(huì)與SQL命令一起,同時(shí)傳遞一個(gè)管道pipe的連接對(duì)象,作為任務(wù)完成后,回傳結(jié)果的渠道。確保,任務(wù)的接收方與發(fā)送方保持一致。

作為第二個(gè)問題的解決方法,可以使用線程池來并發(fā)獲取任務(wù)隊(duì)列中的task,然后執(zhí)行命令并回傳結(jié)果。

第二次改進(jìn)

第一次改進(jìn)的效果還是很明顯的,不用任何測(cè)試手段。直接點(diǎn)擊頁面鏈接,可以很直觀地感覺到反應(yīng)速度有很明顯的加快。

但是對(duì)于第二個(gè)問題,使用線程池還是有些欠妥當(dāng)。因?yàn)椋珻Python解釋器存在GIL問題,所有線程實(shí)際上都在一個(gè)解釋器進(jìn)程里調(diào)度。線程稍微開多一點(diǎn),解釋器進(jìn)程就會(huì)頻繁的切換線程,而線程切換的開銷也不小。線程多一點(diǎn),甚至?xí)霈F(xiàn)“抖動(dòng)”問題(也就是剛剛喚醒一個(gè)線程,就進(jìn)入掛起狀態(tài),剛剛換到棧幀或內(nèi)存的上下文,又被換回內(nèi)存或者磁盤),效率大大降低。也就是說,線程池的并發(fā)量很有限。

試過了多進(jìn)程、多線程,只能在單個(gè)線程里做文章了。

Python中的asyncio庫

Python里有大量的協(xié)程庫可以實(shí)現(xiàn)單線程內(nèi)的并發(fā)操作,比如Twisted、Gevent等等。Python官方在3.5版本里提供了asyncio庫同樣可以實(shí)現(xiàn)協(xié)程并發(fā)。asyncio庫大大降低了Python中協(xié)程的實(shí)現(xiàn)難度,就像定義普通函數(shù)那樣就可以了,只是要在def前面多加一個(gè)async關(guān)鍵詞。async def函數(shù)中,需要阻塞在其他async def函數(shù)的位置前面可以加上await關(guān)鍵詞。

import asyncio

async def wait():

await asyncio.sleep(2)

async def execute(task):

process_task(task)

await wait()

continue_job()

async def函數(shù)的執(zhí)行稍微麻煩點(diǎn)。需要首先獲取一個(gè)loop對(duì)象,然后由這個(gè)對(duì)象代為執(zhí)行async def函數(shù)。

loop = asyncio.get_event_loop()

loop.run_until_complete(execute(task))

loop.close()

loop在執(zhí)行execute(task)函數(shù)時(shí),如果遇到await關(guān)鍵字,就會(huì)暫時(shí)掛起當(dāng)前協(xié)程,轉(zhuǎn)而去執(zhí)行其他阻塞在await關(guān)鍵詞的協(xié)程,從而實(shí)現(xiàn)協(xié)程并發(fā)。

不過需要注意的是,run_until_complete()函數(shù)本身是一個(gè)阻塞函數(shù)。也就是說,當(dāng)前線程會(huì)等候一個(gè)run_until_complete()函數(shù)執(zhí)行完畢之后,才會(huì)繼續(xù)執(zhí)行下一部函數(shù)。所以下面這段代碼并不能并發(fā)執(zhí)行。

for task in task_list:

loop.run_until_complete(task)

對(duì)與這個(gè)問題,asyncio庫也有相應(yīng)的解決方案:gather函數(shù)。

loop = asyncio.get_event_loop()

tasks = [asyncio.ensure_future(execute(task))

for task in task_list]

loop.run_until_complete(asyncio.gather(*tasks))

loop.close()

當(dāng)然了,async def函數(shù)的執(zhí)行并不只有這兩種解決方案,還有call_soon與run_forever的配合執(zhí)行等等,更多內(nèi)容還請(qǐng)參考官方文檔。

Python下的I/O多路復(fù)用

協(xié)程,實(shí)際上,也存在上下文切換,只不過開銷很輕微。而I/O多路復(fù)用則完全不存在這個(gè)問題。

目前,Linux上比較火的I/O多路復(fù)用API要算epoll了。Tornado,就是通過調(diào)用C語言封裝的epoll庫,成功解決了C10K問題(當(dāng)然還有Pypy的功勞)。

在Linux里查文檔,可以看到epoll只有三類函數(shù),調(diào)用起來比較方便易懂。

創(chuàng)建epoll對(duì)象,并返回其對(duì)應(yīng)的文件描述符(file descriptor)。

int epoll_create(int size);

int epoll_create1(int flags);

控制監(jiān)聽事件。第一個(gè)參數(shù)epfd就對(duì)應(yīng)于前面命令創(chuàng)建的epoll對(duì)象的文件描述符;第二個(gè)參數(shù)表示該命令要執(zhí)行的動(dòng)作:監(jiān)聽事件的新增、修改或者刪除;第三個(gè)參數(shù),是要監(jiān)聽的文件對(duì)應(yīng)的描述符;第四個(gè),代表要監(jiān)聽的事件。

int epoll_ctl(int epfd, int op, int fd, struct epoll_event *event);

等候。這是一個(gè)阻塞函數(shù),調(diào)用者會(huì)等候內(nèi)核通知所注冊(cè)的事件被觸發(fā)。

int epoll_wait(int epfd, struct epoll_event *events,

int maxevents, int timeout);

int epoll_pwait(int epfd, struct epoll_event *events,

int maxevents, int timeout,

const sigset_t *sigmask);

在Python的select庫里:

select.epoll()對(duì)應(yīng)于第一類創(chuàng)建函數(shù);

epoll.register(),epoll.unregister(),epoll.modify()均是對(duì)控制函數(shù)epoll_ctl的封裝;

epoll.poll()則是對(duì)等候函數(shù)epoll_wait的封裝。

Python里epoll相關(guān)API的最大問題應(yīng)該是在epoll.poll()。相比于其所封裝的epoll_wait,用戶無法手動(dòng)指定要等候的事件,也就是后者的第二個(gè)參數(shù)struct epoll_event *events。沒法實(shí)現(xiàn)精確控制。因此只能使用替代方案:select.select()函數(shù)。

根據(jù)Python官方文檔,select.select(rlist, wlist, xlist[, timeout])是對(duì)Unix系統(tǒng)中select函數(shù)的直接調(diào)用,與C語言API的傳參很接近。前三個(gè)參數(shù)都是列表,其中的元素都是要注冊(cè)到內(nèi)核的文件描述符。如果想用自定義類,就要確保實(shí)現(xiàn)了fileno()方法。

其分別對(duì)應(yīng)于:

rlist: 等候直到可讀

wlist: 等候直到可寫

xlist: 等候直到異常。這個(gè)異常的定義,要查看系統(tǒng)文檔。

select.select(),類似于epoll.poll(),先注冊(cè)文件和事件,然后保持等候內(nèi)核通知,是阻塞函數(shù)。

實(shí)際應(yīng)用

Psycopg2庫支持對(duì)異步和協(xié)程,但和一般情況下的用法略有區(qū)別。普通數(shù)據(jù)庫連接支持不同線程中的不同游標(biāo)并發(fā)查詢;而異步連接則不支持不同游標(biāo)的同時(shí)查詢。所以異步連接的不同游標(biāo)之間必須使用I/O復(fù)用方法來協(xié)調(diào)調(diào)度。

所以,我的大致實(shí)現(xiàn)思路是這樣的:首先并發(fā)執(zhí)行大量協(xié)程,從任務(wù)隊(duì)列中提取任務(wù),再向連接池請(qǐng)求連接,創(chuàng)建游標(biāo),然后執(zhí)行命令,并返回結(jié)果。在獲取游標(biāo)和接受查詢結(jié)果之前,均要阻塞等候內(nèi)核通知連接可用。

其中,連接池返回連接時(shí),會(huì)根據(jù)引用連接的協(xié)程數(shù)量,返回負(fù)載最輕的連接。這也是自己定義AsyncConnectionPool類的目的。

我的代碼位于:bottle-blog/dbservice.py

存在問題

當(dāng)然了,這個(gè)流程目前還一些問題。

首先就是每次輪詢拿到任務(wù)之后,都會(huì)走這么一個(gè)流程。

獲取連接 -- 新建游標(biāo) -- 執(zhí)行任務(wù) -- 關(guān)閉游標(biāo) -- 取消連接引用

本來,最好的情況應(yīng)該是:在輪詢之前,就建好游標(biāo);在輪詢時(shí),直接等候內(nèi)核通知,執(zhí)行相應(yīng)任務(wù)。這樣可以減少輪詢時(shí)的任務(wù)量。但是如果協(xié)程提前對(duì)應(yīng)好連接,那就不能保證在獲取任務(wù)時(shí),保持各連接負(fù)載均衡了。

所以這一塊,還有工作要做。

還有就是epoll沒能用上,有些遺憾。

以后打算寫點(diǎn)C語言的內(nèi)容,或者用Python/C API,或者用Ctypes包裝共享庫,來實(shí)現(xiàn)epoll的調(diào)用。

最后,請(qǐng)?jiān)试S我吐槽一下Python的epoll相關(guān)文檔:簡直太弱了?。?!必須看源碼才能弄清楚功能。

python:如何以非阻塞的方式讀

代碼是這樣的:

subp = subprocess.Popen(["d:/T1.exe"], shell=True, stdout=subprocess.PIPE, bufsize=0)

subp.stdout.read()

但是發(fā)現(xiàn)read和readline函數(shù)是阻塞方式調(diào)用的,一定要subprocess運(yùn)行結(jié)束才能返回?cái)?shù)據(jù)。

新聞名稱:python里的阻塞函數(shù),Python 阻塞
鏈接地址:http://jinyejixie.com/article26/hsihcg.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供移動(dòng)網(wǎng)站建設(shè)、面包屑導(dǎo)航、網(wǎng)頁設(shè)計(jì)公司、品牌網(wǎng)站建設(shè)、企業(yè)建站、網(wǎng)站策劃

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場,如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

網(wǎng)站托管運(yùn)營
卢氏县| 镇安县| 湘乡市| 新建县| 沧源| 霍林郭勒市| 保山市| 酉阳| 任丘市| 盐城市| 麻江县| 毕节市| 昭平县| 偃师市| 弋阳县| 昌平区| 马尔康县| 清远市| 林口县| 黄龙县| 德钦县| 长沙县| 玉龙| 盐边县| 包头市| 汕尾市| 麦盖提县| 华亭县| 将乐县| 得荣县| 承德市| 新乡县| 洛川县| 思南县| 平安县| 石景山区| 民县| 济宁市| 磐安县| 鄢陵县| 长乐市|