中文字幕人妻中文_99精品欧美一区二区三区综合在线_精品久久久久一区二区_色月丁香_免费福利在线视频_欧美大片免费观看网址_国产伦精品一区二区三区在线播放_污污污污污污www网站免费_久久月本道色综合久久_色69激情爱久久_尹人香蕉久久99天天拍_国产美女www_亚洲国产精品无码7777一线_五月婷婷六月激情_看免费一级片_精品久久久久久成人av_在线色亚洲_女人另类性混交zo_国产精品青青在线观看爽香蕉_人人澡人人添人人爽一区二区

主頁 > 知識庫 > 深入理解python協(xié)程

深入理解python協(xié)程

熱門標簽:北京電信外呼系統(tǒng)靠譜嗎 無錫客服外呼系統(tǒng)一般多少錢 地圖標注視頻廣告 老人電話機器人 高德地圖標注是免費的嗎 大連crm外呼系統(tǒng) 洪澤縣地圖標注 百度地圖標注位置怎么修改 梅州外呼業(yè)務(wù)系統(tǒng)

一、什么是協(xié)程

協(xié)程擁有自己的寄存器和棧。協(xié)程調(diào)度切換的時候,將寄存器上下文和棧都保存到其他地方,在切換回來的時候,恢復(fù)到先前保存的寄存器上下文和棧,因此:協(xié)程能保留上一次調(diào)用狀態(tài),每次過程重入時,就相當(dāng)于進入上一次調(diào)用的狀態(tài)。

協(xié)程的好處:

  • 1.無需線程上下文切換的開銷(還是單線程)
  • 2.無需原子操作(一個線程改一個變量,改一個變量的過程就可以稱為原子操作)的鎖定和同步的開銷
  • 3.方便切換控制流,簡化編程模型
  • 4.高并發(fā)+高擴展+低成本:一個cpu支持上萬的協(xié)程都沒有問題,適合用于高并發(fā)處理

缺點:

  • 1.無法利用多核的資源,協(xié)程本身是個單線程,它不能同時將單個cpu的多核用上,協(xié)程需要和進程配合才能運用到多cpu上(協(xié)程是跑在線程上的)
  • 2.進行阻塞操作時會阻塞掉整個程序:如io

二、了解協(xié)程的過程

2.1、yield工作原理

從語法上來看,協(xié)程和生成器類似,都是定義體中包含yield關(guān)鍵字的函數(shù)。

yield在協(xié)程中的用法:

  • 在協(xié)程中yield通常出現(xiàn)在表達式的右邊,例如:datum = yield,可以產(chǎn)出值,也可以不產(chǎn)出--如果yield關(guān)鍵字后面沒有表達式,那么生成器產(chǎn)出None。
  • 在協(xié)程中yield也可能從調(diào)用方接受數(shù)據(jù),調(diào)用方是通過send(datum)的方式把數(shù)據(jù)提供給協(xié)程使用,而不是next(...)函數(shù),通常調(diào)用方會把值推送給協(xié)程。
  • 協(xié)程可以把控制器讓給中心調(diào)度程序,從而激活其他的協(xié)程。

所以總體上在協(xié)程中把yield看做是控制流程的方式。

先通過一個簡單的協(xié)程的例子理解:

def simple_demo():
    print("start")
    x = yield
    print("x:", x)

sd = simple_demo()
next(sd)
sd.send(10)

---------------------------

>>> start
>>> x: 10
>>> Traceback (most recent call last):
>>>   File "D:/python_projects/untitled3/xiecheng1.py", line 9, >>> in module>
>>>     sd.send(10)
>>> StopIteration

對上述例子的分析:

yield 的右邊沒有表達式,所以這里默認產(chǎn)出的值是None
剛開始先調(diào)用了next(...)是因為這個時候生成器還沒有啟動,沒有停在yield那里,這個時候也是無法通過send發(fā)送數(shù)據(jù)。所以當(dāng)我們通過next(...)激活協(xié)程后,程序就會運行到x = yield,這里有個問題我們需要注意,x = yield這個表達式的計算過程是先計算等號右邊的內(nèi)容,然后在進行賦值,所以當(dāng)激活生成器后,程序會停在yield這里,但并沒有給x賦值。

當(dāng)我們調(diào)用send方法后yield會收到這個值并賦值給x,而當(dāng)程序運行到協(xié)程定義體的末尾時和用生成器的時候一樣會拋出StopIteration異常

如果協(xié)程沒有通過next(...)激活(同樣我們可以通過send(None)的方式激活),但是我們直接send,會提示如下錯誤:

def simple_demo():
    print("start")
    x = yield
    print("x:", x)

sd = simple_demo()
# next(sd)
sd.send(10)

---------------------------

>>> Traceback (most recent call last):
>>>   File "D:/python_projects/untitled3/xiecheng1.py", line 9, >>> in module>
>>>     sd.send(10)
>>> TypeError: can't send non-None value to a just-started generator

關(guān)于調(diào)用next(...)函數(shù)這一步通常稱為”預(yù)激(prime)“協(xié)程,即讓協(xié)程向前執(zhí)行到第一個yield表達式,準備好作為活躍的協(xié)程使用

協(xié)程在運行過程中有四個狀態(tài):

  • GEN_CREATE:等待開始執(zhí)行
  • GEN_RUNNING:解釋器正在執(zhí)行,這個狀態(tài)一般看不到
  • GEN_SUSPENDED:在yield表達式處暫停
  • GEN_CLOSED:執(zhí)行結(jié)束

通過下面例子來查看協(xié)程的狀態(tài):

>>> from inspect import getgeneratorstate
>>> def simple_demo(a):
    print("start: a = ", a)
    b = yield a
    print("b = ", b)
    c = yield a + b
    print("c = ", c)

    
>>> sd = simple_demo(2)
>>> print(getgeneratorstate(sd))
GEN_CREATED
>>> next(sd)  # 預(yù)激協(xié)程,使它走到第一個yield處,因為第一個yield處有yield值a,所以返回a的值,然后在此yield處阻塞
start: a =  2
2
>>> print(getgeneratorstate(sd))
GEN_SUSPENDED
>>> sd.send(3) # 發(fā)送3,進入?yún)f(xié)程接著上一次阻塞的yield處執(zhí)行,yield接收參數(shù)3賦值給b,到下一個yield處返回a+b的值,然后在此yield處再次阻塞,等待下次send值
b =  3
5
>>> sd.send(4) # 同上一次send過程,到此結(jié)束拋異常
c =  4
Traceback (most recent call last):
  File "pyshell#8>", line 1, in module>
    sd.send(4)
StopIteration
>>> print(getgeneratorstate(sd))
GEN_CLOSED

可以通過注釋理解這個例子。

接著再通過一個計算平均值的例子來繼續(xù)理解:

>>> def averager():
	total = 0.0
	count = 0
	average = None
	while True:
		term = yield average
		total += term
		count += 1
		average = total/count

		
>>> avg = averager()
>>> next(avg)
>>> avg.send(10)
10.0
>>> avg.send(30)
20.0
>>> avg.send(40)
26.666666666666668

這里是一個死循環(huán),只要不停send值給協(xié)程,可以一直計算下去。
通過上面的幾個例子我們發(fā)現(xiàn),我們?nèi)绻胍_始使用協(xié)程的時候必須通過next(...)方式激活協(xié)程,如果不預(yù)激,這個協(xié)程就無法使用,如果哪天在代碼中遺忘了那么就出問題了,所以有一種預(yù)激協(xié)程的裝飾器,可以幫助我們干這件事。

2.2、預(yù)激協(xié)程的裝飾器

下面是預(yù)激裝飾器的演示例子:

from functools import wraps

def coroutine(func):
    @wraps(func)
    def primer(*args,**kwargs):
        gen = func(*args,**kwargs)
        next(gen)
        return gen
    return primer

@coroutine
def averager():
    total = 0.0
    count = 0
    average = None
    while True:
        term = yield average
        total += term
        count += 1
        average = total/count

coro_avg = averager()
from inspect import getgeneratorstate
print(getgeneratorstate(coro_avg))
print(coro_avg.send(10))
print(coro_avg.send(30))
print(coro_avg.send(5))

---------------------------

>>> GEN_SUSPENDED
>>> 10.0
>>> 20.0
>>> 15.0

關(guān)于預(yù)激,在使用yield from句法調(diào)用協(xié)程的時候,會自動預(yù)激活,這樣其實與我們上面定義的coroutine裝飾器是不兼容的,在python3.4里面的asyncio.coroutine裝飾器不會預(yù)激協(xié)程,因此兼容yield from

2.3、終止協(xié)程和異常處理

協(xié)程中未處理的異常會向上冒泡,傳給 next 函數(shù)或 send 方法的調(diào)用方(即觸發(fā)協(xié)程的對象)。

繼續(xù)使用上面averager的例子

>>> coro_avg = averager()
>>> coro_avg.send(40)
40.0
>>> coro_avg.send(50)
45.0
>>> coro_avg.send('spam')
Traceback (most recent call last):
...
TypeError: unsupported operand type(s) for +=: 'float' and 'str'
>>> coro_avg.send(60)
Traceback (most recent call last):
File "stdin>", line 1, in module>
StopIteration

由于在協(xié)程內(nèi)沒有處理異常,協(xié)程會終止。如果試圖重新激活協(xié)程,會拋出StopIteration 異常。

從 Python 2.5 開始,客戶代碼可以在生成器對象上調(diào)用兩個方法:throw 和 close,顯式地把異常發(fā)給協(xié)程。

1:generator.throw(exc_type[, exc_value[, traceback]])

使生成器在暫停的 yield 表達式處拋出指定的異常。如果生成器處理了拋出的異常,代碼會向前執(zhí)行到下一個 yield 表達式,而產(chǎn)出的值會成為調(diào)用 generator.throw方法得到的返回值。如果生成器沒有處理拋出的異常,異常會向上冒泡,傳到調(diào)用方的上下文中。

2:generator.close()

使生成器在暫停的 yield 表達式處拋出 GeneratorExit 異常。如果生成器沒有處理這個異常,或者拋出了 StopIteration 異常(通常是指運行到結(jié)尾),調(diào)用方不會報錯。如果收到 GeneratorExit 異常,生成器一定不能產(chǎn)出值,否則解釋器會拋出RuntimeError 異常。生成器拋出的其他異常會向上冒泡,傳給調(diào)用方。

示例如下:

from inspect import getgeneratorstate
class DemoException(Exception):
    """為這次演示定義的異常類型。"""
    pass
    
def demo_exc_handling():
    print('-> coroutine started')
    while True:
        try:
            x = yield
        except DemoException:
            print('*** DemoException handled. Continuing...')
        else:
            print('-> coroutine received: {!r}'.format(x))
    raise RuntimeError('This line should never run.')
    
>>> exc_coro = demo_exc_handling()
>>> next(exc_coro)
-> coroutine started
>>> exc_coro.send(11)
-> coroutine received: 11
>>> exc_coro.send(22)
-> coroutine received: 22

>>> exc_coro.throw(DemoException)
*** DemoException handled. Continuing...
>>> getgeneratorstate(exc_coro)
'GEN_SUSPENDED'
>>> exc_coro.close()
>>> getgeneratorstate(exc_coro)
'GEN_CLOSED'

2.4、讓協(xié)程返回值

在Python2中,生成器函數(shù)中的return不允許返回附帶返回值。在Python3中取消了這一限制,因而允許協(xié)程可以返回值:

from collections import namedtuple
Result = namedtuple('Result', 'count average')

def averager():
    total = 0.0
    count = 0
    average = None
    while True:
        term = yield
        if term is None:
            break
        total += term
        count += 1
        average = total/count
    return Result(count, average)
    
>>> coro_avg = averager()
>>> next(coro_avg)
>>> coro_avg.send(10)
>>> coro_avg.send(30)
>>> coro_avg.send(6.5)
>>> coro_avg.send(None)
Traceback (most recent call last):
...
StopIteration: Result(count=3, average=15.5)   

發(fā)送 None 會終止循環(huán),導(dǎo)致協(xié)程結(jié)束,返回結(jié)果。一如既往,生成器對象會拋出StopIteration 異常。異常對象的 value 屬性保存著返回的值。

注意,return 表達式的值會偷偷傳給調(diào)用方,賦值給 StopIteration 異常的一個屬性。這樣做有點不合常理,但是能保留生成器對象的常規(guī)行為——耗盡時拋出StopIteration 異常。如果需要接收返回值,可以這樣:

>>> try:
...    coro_avg.send(None)
... except StopIteration as exc:
...    result = exc.value
...
>>> result
Result(count=3, average=15.5)

獲取協(xié)程的返回值要繞個圈子,可以使用Python3.3引入的yield from獲取返回值。yield from 結(jié)構(gòu)會在內(nèi)部自動捕獲 StopIteration 異常。這種處理方式與 for 循環(huán)處理 StopIteration 異常的方式一樣。對 yield from 結(jié)構(gòu)來說,解釋器不僅會捕獲 StopIteration 異常,還會把value 屬性的值變成 yield from 表達式的值。

2.5、yield from的使用

yield from 是 Python3.3 后新加的語言結(jié)構(gòu)。在其他語言中,類似的結(jié)構(gòu)使用 await 關(guān)鍵字,這個名稱好多了,因為它傳達了至關(guān)重要的一點:在生成器 gen 中使用 yield from subgen() 時,subgen 會獲得控制權(quán),把產(chǎn)出的值傳給 gen 的調(diào)用方,即調(diào)用方可以直接控制 subgen。與此同時,gen 會阻塞,等待 subgen 終止。

yield from 可用于簡化 for 循環(huán)中的 yield 表達式。例如:

>>> def gen():
... for c in 'AB':
...     yield c
... for i in range(1, 3):
...     yield i
...
>>> list(gen())
['A', 'B', 1, 2]

可以改為

>>> def gen():
...     yield from 'AB'
...     yield from range(1, 3)
...
>>> list(gen())
['A', 'B', 1, 2]

yield from x 表達式對 x 對象所做的第一件事是,調(diào)用 iter(x),從中獲取迭代器。因此,x 可以是任何可迭代的對象。

如果 yield from 結(jié)構(gòu)唯一的作用是替代產(chǎn)出值的嵌套 for 循環(huán),這個結(jié)構(gòu)很有可能不會添加到 Python 語言中。

yield from 的主要功能是打開雙向通道,把最外層的調(diào)用方與最內(nèi)層的子生成器連接起來,這樣二者可以直接發(fā)送和產(chǎn)出值,還可以直接傳入異常,而不用在位于中間的協(xié)程中添加大量處理異常的樣板代碼。有了這個結(jié)構(gòu),協(xié)程可以通過以前不可能的方式委托職責(zé)。

PEP 380 使用了一些yield from使用的專門術(shù)語:

  • 委派生成器:包含 yield from 表達式的生成器函數(shù);
  • 子生成器:從 yield from 表達式中 部分獲取的生成器;
  • 調(diào)用方:調(diào)用委派生成器的客戶端代碼;

委派生成器在 yield from 表達式處暫停時,調(diào)用方可以直接把數(shù)據(jù)發(fā)給子生成器,子生成器再把產(chǎn)出的值發(fā)給調(diào)用方。子生成器返回之后,解釋器會拋出StopIteration 異常,并把返回值附加到異常對象上,此時委派生成器會恢復(fù)。

下面是一個求平均身高和體重的示例代碼:

from collections import namedtuple

Result = namedtuple('Result', 'count average')

# 子生成器
def averager():
    total = 0.0
    count = 0
    average = None
    while True:
        # main 函數(shù)發(fā)送數(shù)據(jù)到這里 
        print("in averager, before yield")
        term = yield
        if term is None: # 終止條件
            break
        total += term
        count += 1
        average = total/count

    print("in averager, return result")
    return Result(count, average) # 返回的Result 會成為grouper函數(shù)中yield from表達式的值


# 委派生成器
def grouper(results, key):
     # 這個循環(huán)每次都會新建一個averager 實例,每個實例都是作為協(xié)程使用的生成器對象
    while True:
        print("in grouper, before yield from averager, key is ", key)
        results[key] = yield from averager()
        print("in grouper, after yield from, key is ", key)


# 調(diào)用方
def main(data):
    results = {}
    for key, values in data.items():
        # group 是調(diào)用grouper函數(shù)得到的生成器對象
        group = grouper(results, key)
        print("\ncreate group: ", group)
        next(group) #預(yù)激 group 協(xié)程。
        print("pre active group ok")
        for value in values:
            # 把各個value傳給grouper 傳入的值最終到達averager函數(shù)中;
            # grouper并不知道傳入的是什么,同時grouper實例在yield from處暫停
            print("send to %r value %f now"%(group, value))
            group.send(value)
        # 把None傳入groupper,傳入的值最終到達averager函數(shù)中,導(dǎo)致當(dāng)前實例終止。然后繼續(xù)創(chuàng)建下一個實例。
        # 如果沒有g(shù)roup.send(None),那么averager子生成器永遠不會終止,委派生成器也永遠不會在此激活,也就不會為result[key]賦值
        print("send to %r none"%group)
        group.send(None)
    print("report result: ")
    report(results)


# 輸出報告
def report(results):
    for key, result in sorted(results.items()):
        group, unit = key.split(';')
        print('{:2} {:5} averaging {:.2f}{}'.format(result.count, group, result.average, unit))


data = {
    'girls;kg':[40, 41, 42, 43, 44, 54],
    'girls;m': [1.5, 1.6, 1.8, 1.5, 1.45, 1.6],
    'boys;kg':[50, 51, 62, 53, 54, 54],
    'boys;m': [1.6, 1.8, 1.8, 1.7, 1.55, 1.6],
}

if __name__ == '__main__':
    main(data) 

grouper 發(fā)送的每個值都會經(jīng)由 yield from 處理,通過管道傳給 averager 實例。grouper 會在 yield from 表達式處暫停,等待 averager 實例處理客戶端發(fā)來的值。averager 實例運行完畢后,返回的值綁定到 results[key] 上。while 循環(huán)會不斷創(chuàng)建 averager 實例,處理更多的值。

外層 for 循環(huán)重新迭代時會新建一個 grouper 實例,然后綁定到 group 變量上。前一個 grouper 實例(以及它創(chuàng)建的尚未終止的 averager 子生成器實例)被垃圾回收程序回收。

代碼結(jié)果如下:

create group:  generator object grouper at 0x7f34ce8458e0>

in grouper, before yield from averager, key is  girls;kg

in averager, before yield

pre active group ok

send to generator object grouper at 0x7f34ce8458e0> value 40.000000 now

in averager, before yield

send to generator object grouper at 0x7f34ce8458e0> value 41.000000 now

in averager, before yield

send to generator object grouper at 0x7f34ce8458e0> value 42.000000 now

in averager, before yield

send to generator object grouper at 0x7f34ce8458e0> value 43.000000 now

in averager, before yield

send to generator object grouper at 0x7f34ce8458e0> value 44.000000 now

in averager, before yield

send to generator object grouper at 0x7f34ce8458e0> value 54.000000 now

in averager, before yield

send to generator object grouper at 0x7f34ce8458e0> none

in averager, return result

in grouper, after yield from, key is  girls;kg

in grouper, before yield from averager, key is  girls;kg

in averager, before yield

create group:  generator object grouper at 0x7f34ce845678>

in grouper, before yield from averager, key is  girls;m

in averager, before yield

pre active group ok

send to generator object grouper at 0x7f34ce845678> value 1.500000 now

in averager, before yield

send to generator object grouper at 0x7f34ce845678> value 1.600000 now

in averager, before yield

send to generator object grouper at 0x7f34ce845678> value 1.800000 now

in averager, before yield

send to generator object grouper at 0x7f34ce845678> value 1.500000 now

in averager, before yield

send to generator object grouper at 0x7f34ce845678> value 1.450000 now

in averager, before yield

send to generator object grouper at 0x7f34ce845678> value 1.600000 now

in averager, before yield

send to generator object grouper at 0x7f34ce845678> none

in averager, return result

in grouper, after yield from, key is  girls;m

in grouper, before yield from averager, key is  girls;m

in averager, before yield

create group:  generator object grouper at 0x7f34ce845620>

in grouper, before yield from averager, key is  boys;kg

in averager, before yield

pre active group ok

send to generator object grouper at 0x7f34ce845620> value 50.000000 now

in averager, before yield

send to generator object grouper at 0x7f34ce845620> value 51.000000 now

in averager, before yield

send to generator object grouper at 0x7f34ce845620> value 62.000000 now

in averager, before yield

send to generator object grouper at 0x7f34ce845620> value 53.000000 now

in averager, before yield

send to generator object grouper at 0x7f34ce845620> value 54.000000 now

in averager, before yield

send to generator object grouper at 0x7f34ce845620> value 54.000000 now

in averager, before yield

send to generator object grouper at 0x7f34ce845620> none

in averager, return result

in grouper, after yield from, key is  boys;kg

in grouper, before yield from averager, key is  boys;kg

in averager, before yield

create group:  generator object grouper at 0x7f34ce8458e0>

in grouper, before yield from averager, key is  boys;m

in averager, before yield

pre active group ok

send to generator object grouper at 0x7f34ce8458e0> value 1.600000 now

in averager, before yield

send to generator object grouper at 0x7f34ce8458e0> value 1.800000 now

in averager, before yield

send to generator object grouper at 0x7f34ce8458e0> value 1.800000 now

in averager, before yield

send to generator object grouper at 0x7f34ce8458e0> value 1.700000 now

in averager, before yield

send to generator object grouper at 0x7f34ce8458e0> value 1.550000 now

in averager, before yield

send to generator object grouper at 0x7f34ce8458e0> value 1.600000 now

in averager, before yield

send to generator object grouper at 0x7f34ce8458e0> none

in averager, return result

in grouper, after yield from, key is  boys;m

in grouper, before yield from averager, key is  boys;m

in averager, before yield

report result: 

 6 boys  averaging 54.00kg

 6 boys  averaging 1.68m

 6 girls averaging 44.00kg

 6 girls averaging 1.58m

這個試驗想表明的關(guān)鍵一點是,如果子生成器不終止,委派生成器會在yield from 表達式處永遠暫停。如果是這樣,程序不會向前執(zhí)行,因為 yield from(與 yield 一樣)把控制權(quán)轉(zhuǎn)交給客戶代碼(即,委派生成器的調(diào)用方)了。

2.6、yield from的意義

把迭代器當(dāng)作生成器使用,相當(dāng)于把子生成器的定義體內(nèi)聯(lián)在 yield from 表達式中。此外,子生成器可以執(zhí)行 return 語句,返回一個值,而返回的值會成為 yield from 表達式的值。

PEP 380 在“Proposal”一節(jié)(https://www.python.org/dev/peps/pep-0380/#proposal)分六點說明了 yield from 的行為。這里幾乎原封不動地引述,不過把有歧義的“迭代器”一詞都換成了“子生成器”,還做了進一步說明。上面的示例闡明了下述四點:

子生成器產(chǎn)出的值都直接傳給委派生成器的調(diào)用方(即客戶端代碼);

使用 send() 方法發(fā)給委派生成器的值都直接傳給子生成器。如果發(fā)送的值是None,那么會調(diào)用子生成器的 next() 方法。如果發(fā)送的值不是 None,那么會調(diào)用子生成器的 send() 方法。如果子生成器拋出 StopIteration 異常,那么委派生成器恢復(fù)運行。任何其他異常都會向上冒泡,傳給委派生成器;

生成器退出時,生成器(或子生成器)中的 return expr 表達式會觸發(fā)StopIteration(expr) 異常拋出;

yield from 表達式的值是子生成器終止時傳給 StopIteration 異常的第一個參數(shù)。

yield from 的具體語義很難理解,尤其是處理異常的那兩點。在PEP 380 中闡述了 yield from 的語義。還使用偽代碼(使用 Python 句法)演示了 yield from 的行為。

若想研究那段偽代碼,最好將其簡化,只涵蓋 yield from 最基本且最常見的用法:yield from 出現(xiàn)在委派生成器中,客戶端代碼驅(qū)動著委派生成器,而委派生成器驅(qū)動著子生成器。為了簡化涉及到的邏輯,假設(shè)客戶端沒有在委派生成器上調(diào)用throw(...) 或 close() 方法。而且假設(shè)子生成器不會拋出異常,而是一直運行到終止,讓解釋器拋出 StopIteration 異常。上面示例中的腳本就做了這些簡化邏輯的假設(shè)。

下面的偽代碼,等效于委派生成器中的 RESULT = yield from EXPR 語句(這里針對的是最簡單的情況:不支持 .throw(...) 和 .close() 方法,而且只處理 StopIteration 異常):

_i = iter(EXPR) 
try:
    _y = next(_i)
except StopIteration as _e:
    _r = _e.value
else:
    while 1:
        _s = yield _y
    try:
        _y = _i.send(_s)
    except StopIteration as _e:
        _r = _e.value
        break
RESULT = _r

但是,現(xiàn)實情況要復(fù)雜一些,因為要處理客戶對 throw(...) 和 close() 方法的調(diào)用,而這兩個方法執(zhí)行的操作必須傳入子生成器。此外,子生成器可能只是純粹的迭代器,不支持 throw(...) 和 close() 方法,因此 yield from 結(jié)構(gòu)的邏輯必須處理這種情況。如果子生成器實現(xiàn)了這兩個方法,而在子生成器內(nèi)部,這兩個方法都會觸發(fā)異常拋出,這種情況也必須由 yield from 機制處理。調(diào)用方可能會無緣無故地讓子生成器自己拋出異常,實現(xiàn) yield from 結(jié)構(gòu)時也必須處理這種情況。最后,為了優(yōu)化,如果調(diào)用方調(diào)用 next(...) 函數(shù)或 .send(None) 方法,都要轉(zhuǎn)交職責(zé),在子生成器上調(diào)用next(...) 函數(shù);僅當(dāng)調(diào)用方發(fā)送的值不是 None 時,才使用子生成器的 .send(...) 方法。

下面的偽代碼,是考慮了上述情況之后,語句:RESULT = yield from EXPR的等效代碼:

_i = iter(EXPR)
try:
    _y = next(_i)
except StopIteration as _e:
    _r = _e.value
else:
    while 1:
        try:
            _s = yield _y
        except GeneratorExit as _e:
            try:
                _m = _i.close
            except AttributeError:
                pass
            else:
                _m()
            raise _e
        except BaseException as _e:
            _x = sys.exc_info()
            try:
                _m = _i.throw
            except AttributeError:
                raise _e
            else:
                try:
                    _y = _m(*_x)
                except StopIteration as _e:
                    _r = _e.value
                    break
        else:
            try:
                if _s is None:
                    _y = next(_i)
                else:
                    _y = _i.send(_s)
            except StopIteration as _e:
                _r = _e.value
                break
RESULT = _r

上面的偽代碼中,會預(yù)激子生成器。這表明,用于自動預(yù)激的裝飾器與 yield from 結(jié)構(gòu)不兼容。

三、greenlet的使用

python中為實現(xiàn)協(xié)程封裝了一些非常好用的包,首先介紹greenlet的使用。

Greenlet是python的一個C擴展,旨在提供可自行調(diào)度的‘微線程', 即協(xié)程。generator實現(xiàn)的協(xié)程在yield value時只能將value返回給調(diào)用者(caller)。 而在greenlet中,target.switch(value)可以切換到指定的協(xié)程(target), 然后yield value。greenlet用switch來表示協(xié)程的切換,從一個協(xié)程切換到另一個協(xié)程需要顯式指定。

以下例子:

from greenlet import greenlet
def test1():
    print(12)
    gr2.switch()
    print(34)

def test2():
    print(56)
    gr1.switch()
    print(78)

gr1 = greenlet(test1)
gr2 = greenlet(test2)
gr1.switch()

---------------------------

>>> 12
>>> 56
>>> 34

當(dāng)創(chuàng)建一個greenlet時,首先初始化一個空的棧, switch到這個棧的時候,會運行在greenlet構(gòu)造時傳入的函數(shù)(首先在test1中打印 12), 如果在這個函數(shù)(test1)中switch到其他協(xié)程(到了test2 打印34),那么該協(xié)程會被掛起,等到切換回來(在test2中切換回來 打印34)。當(dāng)這個協(xié)程對應(yīng)函數(shù)執(zhí)行完畢,那么這個協(xié)程就變成dead狀態(tài)。

對于greenlet,最常用的寫法是 x = gr.switch(y)。 這句話的意思是切換到gr,傳入?yún)?shù)y。當(dāng)從其他協(xié)程(不一定是這個gr)切換回來的時候,將值付給x。

import greenlet
def test1(x, y):
    z = gr2.switch(x+y)
    print 'test1 ', z

def test2(u):
    print 'test2 ', u
    gr1.switch(10)

gr1 = greenlet.greenlet(test1)
gr2 = greenlet.greenlet(test2)
print gr1.switch("hello", " world")

---------------------------

>>> 'test2 ' 'hello world'
>>> 'test1 ' 10
>>> None

上面的例子,第12行從main greenlet切換到了gr1,test1第3行切換到了gs2,然后gr1掛起,第8行從gr2切回gr1時,將值(10)返回值給了 z。

使用greenlet需要注意一下三點:

  • 第一:greenlet創(chuàng)生之后,一定要結(jié)束,不能switch出去就不回來了,否則容易造成內(nèi)存泄露
  • 第二:python中每個線程都有自己的main greenlet及其對應(yīng)的sub-greenlet ,不能線程之間的greenlet是不能相互切換的
  • 第三:不能存在循環(huán)引用,這個是官方文檔明確說明

四、gevent的使用

gevent可以自動捕獲I/O耗時操作,來自動切換協(xié)程任務(wù)。

import gevent

def f1():
    for i in range(5):
        print('run func: f1, index: %s ' % i)
        gevent.sleep(1)

def f2():
    for i in range(5):
        print('run func: f2, index: %s ' % i)
        gevent.sleep(1)

t1 = gevent.spawn(f1)
t2 = gevent.spawn(f2)
gevent.joinall([t1, t2])

------------------------------

>>> run func: f1, index: 0 
>>> run func: f2, index: 0 
>>> run func: f1, index: 1 
>>> run func: f2, index: 1 
>>> run func: f1, index: 2 
>>> run func: f2, index: 2 
>>> run func: f1, index: 3 
>>> run func: f2, index: 3 
>>> run func: f1, index: 4 
>>> run func: f2, index: 4 

由圖中可以看出,f1和f2是交叉打印信息的,因為在代碼執(zhí)行的過程中,我們?nèi)藶槭褂胓event.sleep(0)創(chuàng)建了一個阻塞,gevent在運行到這里時就會自動切換函數(shù)切換函數(shù)。也可以在執(zhí)行的時候sleep更長時間,可以發(fā)現(xiàn)兩個函數(shù)基本是同時運行然后各自等待。

關(guān)于協(xié)程,首先要充分理解協(xié)程的實現(xiàn)原理,然后使用現(xiàn)有的輪子greenlet和gevent時才能更加得心應(yīng)手!

以上就是深入理解python協(xié)程的詳細內(nèi)容,更多關(guān)于python協(xié)程的資料請關(guān)注腳本之家其它相關(guān)文章!

您可能感興趣的文章:
  • Python協(xié)程asyncio異步編程筆記分享
  • 淺談Python協(xié)程asyncio
  • 淺談Python協(xié)程
  • python協(xié)程用法實例分析
  • javascript實現(xiàn)鼠標拖尾特效
  • JavaScript循環(huán)遍歷的24個方法,你都知道嗎
  • JavaScript實現(xiàn)簡單拖拽效果
  • JavaScript 數(shù)組去重詳解
  • 簡單談?wù)凧avaScript變量提升
  • Python 協(xié)程與 JavaScript 協(xié)程的對比

標簽:怒江 長春 泉州 吉林 岳陽 安慶 洛陽 清遠

巨人網(wǎng)絡(luò)通訊聲明:本文標題《深入理解python協(xié)程》,本文關(guān)鍵詞  深入,理解,python,協(xié)程,深入,;如發(fā)現(xiàn)本文內(nèi)容存在版權(quán)問題,煩請?zhí)峁┫嚓P(guān)信息告之我們,我們將及時溝通與處理。本站內(nèi)容系統(tǒng)采集于網(wǎng)絡(luò),涉及言論、版權(quán)與本站無關(guān)。
  • 相關(guān)文章
  • 下面列出與本文章《深入理解python協(xié)程》相關(guān)的同類信息!
  • 本頁收集關(guān)于深入理解python協(xié)程的相關(guān)信息資訊供網(wǎng)民參考!
  • 推薦文章
    主站蜘蛛池模板: 东芝机械上海有限公司| 哈尔滨工程机械有限公司| 恩比尔(厦门)机械制造有限公司| 鞍山机械制造有限公司| 衡阳华意机械有限公司| 上海杉野机械有限公司| 山东枭隆机械有限公司| 常州远见机械有限公司| 湖北三六重工有限公司| 天津精密机械有限公司| 深圳市机械设备有限公司| 东莞市沃德精密机械有限公司| 山东恒基钢铁有限公司| 华亿机械制造有限公司| 张家口煤机械有限公司| 沈阳重工食品有限公司| 葛洲坝能源重工有限公司| 重庆 机械有限公司| 湖南天拓重工有限公司| 江阴市祥达机械制造有限公司 | 起帆电缆有限公司上市| 中马园林机械有限公司| 苏州拓博机械有限公司| 上海御流包装机械有限公司| 贵阳长乐钢铁有限公司| 邢台 机械有限公司| 苏州精密机械有限公司| 青岛精锐机械制造有限公司 | 龙口海盟机械有限公司| 农业机械装备有限公司| 无锡市 机械有限公司| 湖南信昌机械有限公司| 广西徐重机械有限公司| 中山 机械有限公司| 埃比西斯机械有限公司| 武汉船用机械有限公司| 唐山隆鑫机械有限公司| 上海诚达机械有限公司| 无锡耀杰机械有限公司| 福建瑜鼎机械有限公司| 江苏苏能机械有限公司| 深圳市硕方精密机械有限公司 | 济南恒铭钢铁有限公司| 河南郑州机械有限公司| 澳太机械制造有限公司| 龙口金正机械有限公司| 温州华联机械有限公司| 山东莱工机械制造有限公司| 太仓倍加机械有限公司| 重庆机械设备有限公司| 天津瑞星传动机械有限公司| 山东矿山机械有限公司| 庆达机械制造有限公司| 吉林省起点医药有限公司| 苏州丰裕机械工程有限公司| 山西天祥机械有限公司| 广西玉柴动力机械有限公司| 四川诚德机械有限公司| 禹城通裕新能源机械铸造有限公司 | 重庆九源机械有限公司| 焦作机械制造有限公司| 广东省重工建筑设计院有限公司| 常州斯塔克机械设备有限公司| 南通力威机械有限公司| 江阴新迪机械有限公司| 烟台金元矿业机械有限公司| 濮阳机械制造有限公司| 东莞宏品智能机械有限公司| 宁波星源机械有限公司| 无锡布勒机械制造有限公司招聘 | 苏州传动机械有限公司| 兄弟机械西安有限公司| 浙江名瑞机械有限公司| 福建群峰机械有限公司| 机械化施工有限公司| 广西玉柴重工有限公司| 戴氏印刷机械有限公司| 贵州华泰机械设备租赁有限公司 | 东莞市金联吹塑机械有限公司 | 深圳市稻田包装机械有限公司| 菏泽瑞康机械有限公司| 江苏中科机械有限公司| 朝阳宏达机械有限公司| 建筑机械设备有限公司| 廊坊德基机械有限公司| 东莞市欧西曼机械设备有限公司| 厦门厦工机械有限公司| 徐州压力机械有限公司| 天津蓝科机械有限公司| 东莞市沃德精密机械有限公司 | 杭州双龙机械有限公司| 安徽普源分离机械制造有限公司| 曲阜润丰机械有限公司| 临沂新天力机械有限公司| 青岛莱恩机械有限公司| 烟台精越达机械设备有限公司| 安徽同铸工程机械有限公司| 新疆丰泰钢铁有限公司| 沃得农业机械有限公司| 安阳市机械有限公司| 河北途盟机械制造有限公司| 邢台钢铁有限公司官网| 沈阳华盛机械有限公司| 广州惠辉机械设备有限公司| 辽宁三君工程机械有限公司| 合肥市春晖机械制造有限公司 | 中信重工开诚智能装备有限公司| 机械有限公司怎么注册| 新乡市佳盛振动机械有限公司| 山东威力重工机床有限公司| 山东鲁机械有限公司| 宝鸡石油机械有限公司| 焦作机械制造有限公司| 重的机械有限公司招聘| 永兴机械设备有限公司| 江阴力达机械有限公司| 南京宏伟屠宰机械制造有限公司 | 浙江兄弟包装机械有限公司| 杭州速能机械有限公司| 烟台东恒机械有限公司| 上海二和机械有限公司| 台州市四海机械有限公司| 建筑装饰有限公司起名| 昆山市机械制造有限公司| 安阳嘉和机械有限公司| 郑州一正重工机械有限公司 | 天津艾尔特精密机械有限公司 | 锦机械设备有限公司| 苏州精锐精密机械有限公司| 青岛广德机械有限公司| 泰田液压机械有限公司| 天门仙粮机械有限公司| 普惠环保机械有限公司| 浙江华昌液压机械有限公司| 杭州亿安机械设备有限公司| 无锡新世杰辊压机械有限公司| 东莞市泽源机械有限公司| 河南矿山机械有限公司| 玛狮工程机械有限公司| 鞍山机械制造有限公司| 四川工程机械有限公司| 上海 包装机械 有限公司| 瑞特精密机械有限公司| 柳州市超凌顺机械制造有限公司 | 沈阳水泥机械有限公司| 饶阳鸿源机械有限公司| 南京赛达机械制造有限公司 | 无锡双象橡塑机械有限公司| 上海久浩机械有限公司| 输送机械设备有限公司| 台州瑞进机械有限公司| 上海起重机械有限公司| 江苏巨威机械有限公司| 金韦尔机械有限公司| 广州山推机械有限公司| 龙口金正机械有限公司| 机械(常州)有限公司| 湖北铁正机械有限公司| 鼎盛机械设备有限公司| 广东信昌机械有限公司| 广西玉柴重工有限公司| 江苏科圣化工机械有限公司| 吉林省起点医药有限公司| 新昌华亿机械有限公司| 武汉机械制造有限公司| 福建三安钢铁有限公司| 浙江威泰机械有限公司| 安徽佶龙机械有限公司| 泰州市机械有限公司| 北京市政中燕工程机械制造有限公司| 机械装备制造有限公司| 上海固好包装机械有限公司| 江阴精力机械有限公司| 中兴机械制造有限公司| 优瑞纳斯液压机械有限公司| 湖南汇杰机械设备有限公司| 临工工程机械有限公司| 邢台振成机械有限公司| 宝力机械有限公司招聘| 安钢闽源钢铁有限公司| 常州 机械 有限公司| 广州惠德机械有限公司| 滨州市机械有限公司| 青岛欧普机械有限公司| 广州市机械制造有限公司| 青岛堡鑫机械有限公司| 南通科邦机械有限公司| 泉州机械制造有限公司| 长沙威重化工机械有限公司| 磊蒙机械设备有限公司| 茂名重力石化机械制造有限公司 | 八达重工机械有限公司| 天马电子机械有限公司| 苏州全彩机械设备有限公司| 安徽好运机械有限公司| 上海瀚艺冷冻机械有限公司 | 起重设备(上海)有限公司| 南京南特精密机械有限公司| 绍兴市 机械有限公司| 长沙旭众机械设备有限公司| 成都松茂工程机械有限公司| 天津 机械有限公司| 藏不起服饰有限公司| 兖矿大陆机械有限公司| 济南速雕数控机械有限公司 | 新乡高服筛分机械有限公司| 三一国杰机械有限公司| 安徽鑫宏机械有限公司| 柳溪机械设备有限公司| 广州新浪爱拓化工机械有限公司| 天津工程机械有限公司| 常州辉机械有限公司| 潍坊润鑫机械有限公司| 合肥成龙钢铁有限公司| 上海冬松精密机械有限公司 | 海星机械制造有限公司| 上海唐迪机械制造有限公司| 南京登峰起重设备制造有限公司| 贵州凯星液力传动机械有限公司 | 安徽艾特巴机械制造有限公司| 鸿兴织带机械有限公司| 宁波科鼎钢铁有限公司| 有限公司 印刷机械| 青岛精锐机械制造有限公司| 沈阳盈好机械有限公司| 长兴军毅机械有限公司| 江阴韩一钢铁有限公司| 南阳奇丰机械有限公司| 宁波科鼎钢铁有限公司| 宁波 钢铁有限公司| 上海威士机械有限公司| 重庆中容石化机械制造有限公司| 山东金成机械有限公司| 青岛铸造机械有限公司| 山东晨灿机械有限公司| 上海航空机械有限公司| 山东晨灿机械有限公司| 宁波德霖机械有限公司| 瑞利包装机械有限公司| 山东云光钢铁有限公司| 温州市春来包装机械有限公司| 阳谷山立克工程机械有限公司| 中山市信元铝门窗机械制造有限公司 | 山东工程机械有限公司| 皋兰兰鑫钢铁有限公司| 浙江天泰机械有限公司| 山东康弘机械有限公司| 山东亚泰重型机械有限公司| 陕西重型机械制造有限公司| 河南龙昌机械制造有限公司| 广东美特机械有限公司| 青岛越海机械有限公司| 青岛中华宇塑料机械有限公司| 河南隧通机械有限公司| 大连红日机械有限公司| 扬州高标机械有限公司| 青岛非凡包装机械有限公司| 三川德青工程机械有限公司| 天津宏大纺织机械有限公司 | 天津海特传动机械有限公司| 江苏金荣机械有限公司| 上海敏杰机械有限公司| 苏州海骏自动化机械有限公司| 浙江荣德机械有限公司| 上海升立机械制造有限公司| 广东中远海运重工有限公司| 大丰奥泰机械有限公司| 华劲机械制造有限公司| 河北雪龙机械制造有限公司| 山东泗水鑫峰面粉机械有限公司| 粮食机械设备有限公司| 宁波华美达机械制造有限公司| 上海本优机械有限公司| 青州市三联重工设备制造有限公司 | 杭州丽伟电脑机械有限公司| 长江液压机械有限公司| 广州永晋机械有限公司| 龙口金正机械有限公司| 济南蓝象数控机械有限公司| 临工工程机械有限公司| 东莞市康机械有限公司| 诸暨市机械有限公司| 中施机械设备有限公司| 新鹏辉钢铁有限公司| 武汉山推机械有限公司| 济南天助升降机械有限公司| 青岛中鸿重型机械有限公司| 泉州机械设备有限公司| 潍坊裕川机械有限公司| 上海凌鹰机械有限公司| 天津 机械设备有限公司| 徐州福曼随车起重机有限公司| 上海神农机械有限公司| 乐陵双鹤机械制造有限公司| 营口金辰机械有限公司| 建材机械制造有限公司| 苏州欧比特机械有限公司| 宁波伟隆传动机械有限公司| 广州华臻机械设备有限公司| 重庆工程机械有限公司| 山鑫机械制造有限公司| 娄底 有限公司 机械| 曲阜艾特机械有限公司| 东阳机械制造有限公司| 山东正丰钢铁有限公司| 星光传动机械有限公司| 上海东蒙路桥机械有限公司| 上海青川机械配件有限公司| 温州工程机械有限公司| 山东明宇重工机械有限公司| 志高机械有限公司官网| 浙江大鹏机械有限公司| 上海合升机械有限公司| 上海敏杰机械有限公司| 济南章力机械有限公司| 大连 起 有限公司| 泉州机械设备有限公司| 山东精诺机械有限公司| 大连鸿升机械有限公司| 上海升立机械制造有限公司| 邦贝机械制造有限公司| 上海定盛机械有限公司| 招商局重工(江苏)有限公司| 广州汉牛机械设备有限公司| 泰田机械制造有限公司| 天津华信机械有限公司| 起步有限公司上市排名| 永盛达机械有限公司| 精密机械配件有限公司| 合肥福晟机械制造有限公司| 河南柴油机重工有限公司| 吉林鑫达钢铁有限公司地址| 宁波固奇包装机械制造有限公司| 自贡机械制造有限公司| 安阳三一机械有限公司| 杭州引春机械有限公司| 福建省晋江市和盛机械有限公司| 山东枭隆机械有限公司| 山东岳峰起重机械有限公司| 浙江蓝宝机械有限公司| 青岛橡胶机械有限公司| 晋江机械制造有限公司| 烟台利丰机械有限公司| 工程有限公司起名大全| 德阳 机械有限公司| 上海天驰制药机械有限公司| 高义钢铁有限公司电话| 元机械制造有限公司| 中欣机械厦门有限公司| 南京化工机械有限公司| 青岛鑫泉塑料机械有限公司| 宜兴市机械有限公司| 山东兴华机械有限公司| 常州市锦益机械有限公司| 唐山前进钢铁有限公司| 如皋市联创捏合机械有限公司| 安徽中科光电色选机械有限公司 | 陀曼精密机械有限公司| 山东鲁机械有限公司| 上海力克机械有限公司| 濮阳市名利石化机械设备制造有限公司 | 起重机制造有限公司| 威海美盛机械有限公司| 密机械(西安)有限公司| 铜陵市富鑫钢铁有限公司| 威海华东重工有限公司| 温州市顺达服装机械有限公司| 宝钢湛江钢铁有限公司| 青岛圣诺机械有限公司| 湖北昌胜机械设备制造有限公司| 安徽食品机械有限公司| 四川广鑫粮油机械制造有限公司| 广东万联包装机械有限公司| 昆山鹤鑫精密机械有限公司| 郑州市恒昌机械制造有限公司 | 宣化金科钻孔机械有限公司| 上海楷钛机械制造有限公司| 福建省 机械有限公司| 上海圣起包装机械有限公司| 北京大起空调有限公司| 上海青川机械配件有限公司| 马鞍山机械有限公司| 江阴市西城钢铁有限公司| 成都中挖机械有限公司| 无锡永兴机械制造有限公司| 上海德珂斯机械自动化技术有限公司| 常州耐强传动机械有限公司| 深圳 机械设备有限公司| 山东包装机械有限公司| 浙江建设机械有限公司| 青岛威尔塑料机械有限公司 | 青岛南牧机械设备有限公司| 武汉格瑞拓机械有限公司| 河南国起泵业有限公司| 北京大起空调有限公司| 富阳液压机械有限公司| 马氏木工机械有限公司| 浩博海门机械有限公司| 浙江德玛克机械有限公司| 南京远景机械有限公司| 江阴市中立机械工业有限公司 | 河南天成矿山起重机有限公司| 天津市三鼎包装机械有限公司| 浙江中益机械有限公司| 富杰精密机械有限公司| 重庆瀚源机械有限公司| 嘉兴格鲁博机械有限公司| 南阳医疗机械有限公司| 上海松仕机械设备有限公司| 山东祥远机械有限公司| 上海凯奇机械设备有限公司| 朝阳重工机械有限公司| 河南朝阳钢铁有限公司| 沈阳六和机械有限公司| 中航国际钢铁贸易有限公司| 瑞安瑞泰机械有限公司| 贵州华泰机械设备租赁有限公司| 成都弘邦机械有限公司| 山东博精化工机械有限公司| 广州力丰机械有限公司| 恒丰机械配件有限公司| 宁波翔博机械有限公司| 徐州明文机械有限公司| 上海连富机械有限公司| 江阴博丰钢铁有限公司| 河北安丰钢铁有限公司| 浙江雷克机械工业有限公司| 杭州灵达机械有限公司| 台州中茂机械有限公司| 飞迈烟台机械有限公司| 内蒙古机械有限公司| 重庆旺田机械有限公司| 合肥金锡机械有限公司| 台州中茂机械有限公司| 浙江鸿森机械有限公司| 上海众星洗涤机械制造有限公司| 江西钧天机械有限公司奔驰| 山东杰卓机械有限公司| 临沂铸信机械有限公司| 成都经纬机械制造有限公司| 旭海机械设备有限公司| 济南华飞数控机械有限公司| 三联传动机械有限公司| 上海派协包装机械有限公司 | 上海卓汇机械有限公司| 北京航天振邦精密机械有限公司 | 成都金瑞建工机械有限公司| 浙江温兄机械阀业有限公司| 荣龙精密机械有限公司| 新乡天丰机械有限公司| 温州天富机械有限公司| 上海楷钛机械制造有限公司| 江苏力源液压机械有限公司| 机械密封件有限公司| 常州 机械有限公司| 广东日钢机械有限公司| 合肥浩凯机械有限公司| 湖南天拓重工机械有限公司| 赛柏精密机械有限公司| 沈阳西城钢铁有限公司| 招商局重工(江苏)有限公司| 湖南金牛重工机械有限公司| 华东油压机械制造有限公司| 济南蓝象数控机械有限公司| 山西中德科工机械制造有限公司| 上海颍盛机械有限公司| 江苏迪迈机械有限公司| 东阳市佳先机械制造有限公司| 重庆明华机械有限公司| 申耀机械工业有限公司| 上海卓亚矿山机械有限公司| 广州新麦机械有限公司| 成都液压机械有限公司| 江苏精明机械有限公司| 合肥光裕机械有限公司| 南京工程机械有限公司| 东莞市英豪机械有限公司| 泰安市民乐机械制造有限公司 | 湖南 机械设备有限公司| 四川欧曼机械有限公司| 鹤壁市双信矿山机械有限公司| 福建烟草机械有限公司| 浙江耐士伦机械有限公司| 山东天龙机械有限公司| 南丰 机械有限公司| 江阴西城钢铁有限公司| 重村钢模机械工业苏州有限公司| 柳州欧维姆机械有限公司| 浙江天盛机械有限公司| 潍坊新成达机械有限公司| 安溪永兴机械有限公司| 长沙机械与制造有限公司| 沈阳透平机械有限公司| 海宁弘德机械有限公司| 湖州惠盛机械有限公司| 河北明芳钢铁有限公司| 青岛科尼乐重工有限公司| 郑州 食品机械有限公司| 深圳机械院建筑设计有限公司| 利勃海尔机械大连有限公司| 抚顺中兴重工有限公司| 武汉机械设备有限公司| 伯曼机械制造有限公司| 承德 机械有限公司| 诸城晶品机械有限公司| 霸州新利钢铁有限公司| 徐州迈特机械有限公司| 合肥浩凯机械有限公司| 昆山乙盛机械有限公司招聘启事| 常州度盛机械有限公司| 佛山市康思达液压机械有限公司 | 德州联合石油机械有限公司| 鞍山机械重工有限公司| 山东山推工程机械结构件有限公司| 烟台金土源机械化工程有限公司 | 上海宏挺机械设备制造有限公司| 东阳市机械有限公司| 上海百劲机械有限公司| 建友机械设备有限公司| 徐州东岳工程机械有限公司| 欧亚德机械有限公司| 浙江超伟机械有限公司| 浙江机械制造有限公司| 浙江珠峰机械有限公司| 济南焊达机械有限公司| 徐州徐工基础工程机械有限公司 | 南通腾中机械有限公司| 四川兴明泰机械有限公司| 张家港白熊科美机械有限公司| 洛阳钢峰机械有限公司| 华东油压机械制造有限公司| 苏州新风机械有限公司| 合肥康恒机械有限公司| 洛阳瑞德机械有限公司| 新乡市起重机厂有限公司| 山东愚公工程机械有限公司| 浙江昌亨机械有限公司| 广东粤凯机械有限公司| 南通庞源机械工程有限公司| 温州贝诺机械有限公司| 嘉厨食品机械有限公司| 龙岩市机械有限公司| 招远华丰机械设备有限公司| 湖北江华机械有限公司| 泸州发展机械有限公司| 马长江钢铁有限公司| 美卓造纸机械有限公司| 上海 乐 机械有限公司| 安阳市赛尔德精工机械有限公司| 常州步速者机械制造有限公司| 瑞达机械设备有限公司| 丹阳荣嘉精密机械有限公司| 江阴市永昌药化机械有限公司 | 济南速雕数控机械有限公司| 四平方向机械有限公司| 河北文丰钢铁有限公司| 青岛明高机械有限公司| 南通盛仕达精密机械有限公司| 营口京华钢铁有限公司招聘| 东莞市正一轴承机械有限公司| 新疆昆玉钢铁有限公司| 临沂 机械有限公司| 中设(苏州)机械设备工程有限公司| 河北强华水利机械有限公司| 常州度盛机械有限公司| 中材重型机械有限公司| 浙江建机工程机械有限公司| 广州机械设备制造有限公司| 徐州随车起重机有限公司| 潍坊凯信机械有限公司| 上海起帆电线电缆有限公司| 山东利丰机械有限公司| 青岛九合重工机械有限公司| 南阳 机械 有限公司| 上海机械实业有限公司| 唐山燕钢钢铁有限公司| 浙江风驰机械有限公司| 常州斯太尔动力机械有限公司| 上海连富机械有限公司| 济南食品机械有限公司| 汶瑞机械山东有限公司| 机械装备制造有限公司| 洛阳耿力机械有限公司| 河南起重机有限公司| 温岭宏业机械有限公司| 小松工程机械有限公司| 长春协展机械工业有限公司 | 安庆恒昌机械有限公司| 山东莱芜煤矿机械有限公司| 广州嘉银机械有限公司| 洛阳中德重工有限公司| 衢州巨鑫机械有限公司| 潍坊裕川机械有限公司| 江西协旭机械有限公司| 东莞安默琳机械制造技术有限公司| 北京航天振邦精密机械有限公司 | 广州乾能机械制造有限公司| 苏州三维精密机械有限公司| 常州金源机械设备有限公司| 广东思沃精密机械有限公司| 福海鑫钢铁有限公司| 无锡海龙机械有限公司| 协展机械工业有限公司| 江苏东钢钢铁有限公司| 徐州 机械制造有限公司| 山东神力起重机械有限公司| 河南合力起重机械有限公司| 西安 机械设备有限公司| 三菱重工上海有限公司| 钦州力顺机械有限公司| 标准缝纫机菀坪机械有限公司 | 温州包装机械有限公司| 河北机械设备有限公司| 乐星机械无锡有限公司| 上海大松机械有限公司| 北京大森长空包装机械有限公司| 北京恒机械设备有限公司| 湖南天拓重工机械有限公司| 诸城科翔机械有限公司| 郑州志乾机械设备有限公司 | 淄博 机械制造有限公司| 中核天津机械有限公司| 肥城金塔机械有限公司| 科尼乐机械设备有限公司| 青岛仕诚塑料机械有限公司| 济南捷迈数控机械有限公司| 济南鼎业机械制造有限公司| 广州坚诺机械设备有限公司| 常州玫尔机械有限公司| 石油机械设备有限公司| 南昌矿山机械有限公司| 上海圣起包装机械有限公司 | 常州经编机械有限公司| 成都中挖机械有限公司| 无锡远方机械有限公司| 上海起鑫贸易有限公司| 厦门船舶重工有限公司| 济南快克数控机械有限公司| 嘉兴市宏丰机械有限公司| 重庆龙建机械有限公司| 台州特特机械有限公司| 江阴中南重工有限公司| 机械配件苏州有限公司| 上海实机械有限公司| 河南省机械有限公司| 汕头市伟力塑料机械厂有限公司| 旭能机械制造有限公司| 上海得力起重索具有限公司| 唐山东方钢铁有限公司| 温州市日力轻工机械有限公司| 河北圣禹水工机械有限公司| 大阳通用机械有限公司| 安徽金丰机械有限公司| 徐州东亚钢铁有限公司| 东莞市固达机械制造有限公司| 常州龙鑫化工机械有限公司| 佛山三技精密机械有限公司| 重庆川凯机械有限公司| 成都艾威机械有限公司| 杭州大禹机械有限公司| 潍坊 重工 有限公司| 深圳起点云有限公司| 丹阳市华泰制药机械有限公司| 桂林平钢钢铁有限公司| 青岛精密机械有限公司| 湖南汇一制药机械有限公司| 安宁市永昌钢铁有限公司| 三菱重工上海有限公司| 盘锦 机械有限公司| 济南市恒宇机械有限公司| 石家庄聚力特机械有限公司| 杭州华兴机械有限公司| 蚌埠液力机械有限公司| 上海祝融起重机械有限公司 | 东莞市科环机械设备有限公司 | 杭州雅顿过滤机械有限公司| 梁发记机械有限公司| 泉州恒泉机械有限公司| 高密永和精密机械有限公司招聘网| 东莞高臻机械设备有限公司| 合肥成龙钢铁有限公司| 徐州徐工施维英机械有限公司 | 东莞太星机械有限公司| 阳春新钢铁有限公司| 盐城万富隆机械制造有限公司| 扬州福尔喜果蔬汁机械有限公司 | 兴龙机械模具有限公司| 东莞市高臻机械设备有限公司 | 龙工机械制造有限公司| 派克包装机械有限公司| 上海天勇机械设备有限公司| 珠海裕丰钢铁有限公司| 浙江纺织机械有限公司| 新乡市东源机械有限公司| 北京包装机械有限公司| 江苏宏威重工机床制造有限公司 | 泉州市劲力工程机械有限公司 | 洛阳中收机械装备有限公司| 安徽宇华机械制造有限公司| 金鹰重型工程机械有限公司| 濮阳市名利石化机械设备制造有限公司| 沧州科信环保机械有限公司| 苏州明基自动化机械设备有限公司 | 朗维纺织机械有限公司| 沈阳捷优机械设备有限公司| 新华机械制造有限公司| 上海松川远亿机械设备有限公司| 东莞高臻机械设备有限公司| 武汉食品机械有限公司| 上海三都机械有限公司| 东莞市浈颖机械设备有限公司| 上海昌强重工机械有限公司| 宁波美亚特精密机械有限公司| 保定 机械有限公司| 南京寿旺机械设备有限公司| 广州新成机械技术有限公司| 宝鸡市机械有限公司| 上海起重设备有限公司| 上海傣纬机械设备有限公司| 大连机械制造有限公司| 山东兴源机械有限公司| 群基精密机械有限公司| 深圳恒盛力包装机械有限公司 | 捷泰克机械有限公司| 洛阳古城机械有限公司| 宁波翔博机械有限公司| 合肥金锡机械有限公司| 安丘市 机械有限公司| 山东锐驰机械有限公司| 强大印刷机械有限公司| 湘东化工机械有限公司| 陕西 机械 有限公司| 山东闽源钢铁有限公司| 万工机械制造有限公司| 东莞市高臻机械设备有限公司| 江阴液压机械有限公司| 杭州一鼎传动机械有限公司| 旭众食品机械有限公司| 泰安古河机械有限公司| 浙江云广机械制造有限公司| 宣化华泰矿冶机械有限公司| 浙江科尔博机械有限公司| 无锡科创机械设计制造有限公司 | 上海泽泽机械有限公司| 江苏双轮泵业机械制造有限公司| 上海相宜机械有限公司| 昆山贝奇精密机械有限公司| 昆山施耐特机械有限公司| 常州步速者机械制造有限公司 | 江西神起信息技术有限公司| 淄博宙灿机械有限公司| 青岛日川精密机械有限公司| 环保设备机械有限公司| 上海 机械 有限公司| 昆山机械设备有限公司| 佛山市包装机械有限公司| 徐州机械制造有限公司| 常州耐强传动机械有限公司| 上海行雄机械有限公司| 上海以海机械有限公司| 东阳市佳先机械制造有限公司| 山东 钢铁有限公司| 南宁敏创机械有限公司| 长沙宏银机械有限公司| 襄阳博亚机械有限公司| 大牧人机械有限公司| 江苏韩通船舶重工有限公司| 恒利达机械有限公司| 派克包装机械有限公司| 深圳机械院建筑设计有限公司 | 宁波威恩精密机械有限公司| 北京余特包装机械有限公司| 苏州三维精密机械有限公司| 浙江精劲机械有限公司| 上海尼尔机械制造有限公司| 鑫阳机械设备有限公司| 郑州中嘉重工有限公司| 山本机械苏州有限公司| 唐山荣程钢铁有限公司| 保定金地机械有限公司| 蓬莱禄昊化工机械有限公司| 全椒 机械有限公司| 宜春江特机械传动有限公司| 温州海翔机械有限公司| 徐州二川机械有限公司| 上海塑胶机械有限公司| 山东鲁成起重机械有限公司| 江苏腾通包装机械有限公司| 旭众食品机械有限公司| 慈溪 机械 有限公司| 三木机械制造实业有限公司| 福建敏捷机械有限公司| 河南工程机械有限公司| 广州市通风机械设备有限公司 | 泰安鑫杰机械有限公司| 青岛欧普机械有限公司| 鄂州吴城钢铁有限公司| 深圳市钢铁有限公司| 泸州长江工程机械成套有限公司| 深圳创能机械有限公司| 摩丁机械常州有限公司| 东莞市台立数控机械有限公司| 宁波华骏机械有限公司| 宁波兴波机械有限公司| 河北石阀机械设备有限公司| 爱克苏州机械有限公司| 南京佳盛机械设备有限公司| 上饶中材机械有限公司| 河南奥创机械设备有限公司| 厦门全新彩钢机械有限公司| 富杰精密机械有限公司| 青岛博朗特机械设备有限公司| 摩丁机械常州有限公司| 昆山乔地精密机械有限公司| 安徽远鸿机械自动化有限公司| 佶缔纳士机械有限公司| 南昌全球机械有限公司| 佛山市科机械有限公司| 江阴锦澄钢铁有限公司| 武汉精密机械有限公司| 承德盛丰钢铁有限公司| 青岛银象机械有限公司| 天津市液压机械有限公司| 青岛莱恩机械有限公司| 东莞市力华机械设备有限公司 | 济南卓恒膨化机械有限公司| 深圳市包装机械有限公司| 佛山市中牌机械有限公司| 江苏长强钢铁有限公司| 威图电子机械技术上海有限公司 | 上海陆达包装机械制造有限公司 | 郑州华隆机械有限公司| 厦门工业机械有限公司| 唐山利军机械有限公司| 东莞亮剑机械有限公司| 河南省机械有限公司| 河北双天机械制造有限公司| 浙江顶峰机械有限公司| 天津同力重工有限公司| 河北联港废钢铁回收有限公司| 机械化施工有限公司| 太原重工轨道交通设备有限公司| 汶上金城机械有限公司| 南京起重机械总厂有限公司| 万杰食品机械有限公司| 苏州华尔普机械有限公司| 宁波工业机械有限公司| 浙江环兴机械有限公司| 德龙钢铁有限公司招聘| 苏州凯威塑料机械有限公司| 深圳恒盛力包装机械有限公司 | 珠海三麦机械有限公司| 青岛双星铸造机械有限公司| 泉州市劲力工程机械有限公司 | 福建巨邦机械有限公司| 江阴市博越机械有限公司| 广东食品机械有限公司| 宁波伟隆传动机械有限公司| 富利源机械有限公司| 徐州华冶机械有限公司| 佛山丰堡精密机械有限公司| 深圳龙润彩印机械设备有限公司 | 深圳市高郭氏精密机械有限公司| 上海戴服特包装机械有限公司| 华力重工机械有限公司| 西安华欧精密机械有限公司 | 湖北首开机械有限公司| 苏州开隆机械有限公司| 翼虎动力机械有限公司| 江苏大圣机械制造有限公司| 吉林小松工程机械有限公司| 河南黄河防爆起重机有限公司 | 泰钢钢铁贸易有限公司| 小松山推工程机械有限公司| 长沙盛泓机械有限公司| 上海众和包装机械有限公司| 爱科农业机械有限公司| 中山力劲机械有限公司| 五矿钢铁西安有限公司| 山东中探机械有限公司| 陕西柴油机重工有限公司| 山东机械铸造有限公司| 荣精密机械有限公司| 机械自动化有限公司| 太仓悦凯精密机械有限公司| 茂名重力石化机械制造有限公司| 湖北鄂重重型机械有限公司| 莒县长运机械有限公司| 山东元裕机械有限公司| 德阳川广机械有限公司| 宁波海雄塑料机械有限公司| 深圳市宏机械设备有限公司| 机械加工有限公司简介| 亨沃机械设备有限公司| 江苏威鹰机械有限公司| 大连世达重工有限公司| 济南数控机械有限公司| 河北犀牛民用机械有限公司| 莱州市华弘机械有限公司| 江山重工机械有限公司| 武汉千里马工程机械有限公司 | 武安市文安钢铁有限公司| 杭州合立机械有限公司| 长沙市机械有限公司| 华丽木工机械有限公司| 长沙众宇机械有限公司| 昆山市机械制造有限公司| 广州汇亿机械有限公司| 青岛越海机械有限公司| 济南数控机械有限公司| 江苏久保田农机机械有限公司| 旭英机械有限公司招聘| 广州东昇机械有限公司| 中山市机械设备有限公司| 吴江聚力机械有限公司| 上海 鑫机械设备有限公司| 宁波威恩精密机械有限公司| 上海力净洗涤机械制造有限公司 | 山东瑞华机械有限公司| 温州工程机械有限公司| 德州 机械有限公司| 上海奉业包装机械有限公司| 济宁机械设备有限公司| 温州正信机械有限公司| 南通液压机械有限公司| 邢台市振成机械有限公司| 福建敏捷机械有限公司| 烟台飞达机械有限公司| 上海三都机械有限公司| 成都 机械有限公司| 浙江伟焕机械制造有限公司| 无锡械锐机械有限公司| 合肥海源机械有限公司| 西安华欧精密机械有限公司| 潍坊华星机械有限公司| 中实洛阳重型机械有限公司实习报告| 济南蓝象数控机械有限公司| 四川盛和机械设备有限公司| 深圳液压机械有限公司| 东莞市兆恒机械有限公司| 深圳市精密机械有限公司| 华劲机械制造有限公司| 昆成机械制造有限公司| 深圳市创世纪机械有限公司| 湖北襄玉机械有限公司| 泉州市机械有限公司| 苏州敏喆机械有限公司| 宁波博旺机械有限公司| 临工工程机械有限公司| 龙口金正机械有限公司| 物理农林机械有限公司| 珠海市中鑫隆机械化建设工程有限公司 | 上海起重电机厂有限公司| 四川工程机械有限公司| 江苏华澄重工有限公司| 山东吉恒机械有限公司| 河南世茂机械制造有限公司| 青岛科泰重工机械有限公司| 肥城云宇机械有限公司| 常州纺织机械有限公司| 浙江中禾机械有限公司| 洛阳易高机械有限公司| 巩义市瑞赛克机械设备有限公司| 烟台建筑机械有限公司| 南通赛孚机械设备有限公司| 重庆川口机械有限公司| 上海奕晟矿山机械有限公司| 环保设备机械有限公司| 扬州巨人机械有限公司| 上海重工机械有限公司| 上海贝得尔石化机械设备有限公司 | 宇进注塑机械有限公司| 柳州丹顺机械有限公司| 无锡通用机械有限公司| 苏州柯瑞机械有限公司| 南通宝钢钢铁有限公司| 潍坊圣川机械有限公司| 重庆有限公司 机械| 南阳机械制造有限公司| 山东大华机械有限公司| 烟台美丰机械有限公司| 江阴凯澄起重机械有限公司| 青岛山森机械有限公司| 河北小犟牛工程机械有限公司 | 昆山市众捷塑料机械有限公司 | 泉州明辉机械有限公司| 常州豪凯机械有限公司| 武汉泛洲机械制造有限公司| 五莲县机械有限公司| 上海中机械有限公司| 山东同洲机械制造有限公司| 杭州建泰机械有限公司| 山东钢铁贸易有限公司| 比力特机械有限公司| 南京贝隆齐机械有限公司| 中阳钢铁有限公司电话| 瑞祥机械制造有限公司| 桂林平钢钢铁有限公司| 江苏冠宇机械设备制造有限公司|