一区二区三区在线-一区二区三区亚洲视频-一区二区三区亚洲-一区二区三区午夜-一区二区三区四区在线视频-一区二区三区四区在线免费观看

腳本之家,腳本語言編程技術(shù)及教程分享平臺!
分類導(dǎo)航

Python|VBS|Ruby|Lua|perl|VBA|Golang|PowerShell|Erlang|autoit|Dos|bat|

服務(wù)器之家 - 腳本之家 - Python - 簡單介紹Python中利用生成器實現(xiàn)的并發(fā)編程

簡單介紹Python中利用生成器實現(xiàn)的并發(fā)編程

2020-06-20 10:35腳本之家 Python

這篇文章主要介紹了簡單介紹Python中利用生成器實現(xiàn)的并發(fā)編程,使用yield生成器函數(shù)進(jìn)行多進(jìn)程編程是Python學(xué)習(xí)進(jìn)階當(dāng)中的重要知識,需要的朋友可以參考下

我們都知道并發(fā)(不是并行)編程目前有四種方式,多進(jìn)程,多線程,異步,和協(xié)程。

多進(jìn)程編程在python中有類似C的os.fork,當(dāng)然還有更高層封裝的multiprocessing標(biāo)準(zhǔn)庫,在之前寫過的python高可用程序設(shè)計方法中提供了類似nginx中master process和worker process間信號處理的方式,保證了業(yè)務(wù)進(jìn)程的退出可以被主進(jìn)程感知。

多線程編程python中有Thread和threading,在linux下所謂的線程,實際上是LWP輕量級進(jìn)程,其在內(nèi)核中具有和進(jìn)程相同的調(diào)度方式,有關(guān)LWP,COW(寫時拷貝),fork,vfork,clone等的資料較多,這里不再贅述。

異步在linux下主要有三種實現(xiàn)select,poll,epoll,關(guān)于異步不是本文的重點(diǎn)。

說協(xié)程肯定要說yield,我們先來看一個例子:

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#coding=utf-8
import time
import sys
# 生產(chǎn)者
def produce(l):
  i=0
  while 1:
    if i < 5:
      l.append(i)
      yield i
      i=i+1
      time.sleep(1)
    else:
      return
   
# 消費(fèi)者
def consume(l):
  p = produce(l)
  while 1:
    try:
      p.next()
      while len(l) > 0:
        print l.pop()
    except StopIteration:
      sys.exit(0)
l = []
consume(l)

在上面的例子中,當(dāng)程序執(zhí)行到produce的yield i時,返回了一個generator,當(dāng)我們在custom中調(diào)用p.next(),程序又返回到produce的yield i繼續(xù)執(zhí)行,這樣l中又append了元素,然后我們print l.pop(),直到p.next()引發(fā)了StopIteration異常。

通過上面的例子我們看到協(xié)程的調(diào)度對于內(nèi)核來說是不可見的,協(xié)程間是協(xié)同調(diào)度的,這使得并發(fā)量在上萬的時候,協(xié)程的性能是遠(yuǎn)高于線程的。

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
import stackless
import urllib2
def output():
  while 1:
    url=chan.receive()
    print url
    f=urllib2.urlopen(url)
    #print f.read()
    print stackless.getcurrent()
   
def input():
  f=open('url.txt')
  l=f.readlines()
  for i in l:
    chan.send(i)
chan=stackless.channel()
[stackless.tasklet(output)() for i in xrange(10)]
stackless.tasklet(input)()
stackless.run()

關(guān)于協(xié)程,可以參考greenlet,stackless,gevent,eventlet等的實現(xiàn)。

延伸 · 閱讀

精彩推薦
主站蜘蛛池模板: 97精品国产高清在线看入口 | 含羞草传媒一天免费看下 | 国产精品亚洲精品观看不卡 | 精品日韩二区三区精品视频 | 欧美日韩在线一区 | 99久久精品国内 | 刺激一区仑乱 | 亚洲系列国产系列 | 国产精品欧美韩国日本久久 | 欧美va免费精品高清在线 | 成人精品第一区二区三区 | 久久re这里精品23 | 村妇超级乱淫伦小说全集 | 2012年中文字幕在线看 | 污污的动态图合集 | 亚洲福利区 | 天若有情1992国语版完整版 | 男人天堂资源网 | 青草久久精品亚洲综合专区 | 国产精品欧美韩国日本久久 | 久久精品热只有精品 | 67194在线免费观看 | 岛国a香蕉片不卡在线观看 荡女淫春2古装 | juliaann大战两个黑人 | 男人含玉势出嫁束器 | 色久网| 日本视频高清 | 成人精品视频一区二区在线 | 男女操bb | 成人免费高清视频 | 精品国产免费观看一区高清 | chinesespanking调教 | 精品国产国产精2020久久日 | 久久 这里只精品 免费 | 午夜福利院电影 | 天天草天天 | 美女脱了内裤让男生尿囗 | 天堂精品高清1区2区3区 | 亚洲swag精品自拍一区 | 香蕉免费一区二区三区在线观看 | 乖女的嫩奶水h文孕妇 |