Äú¿ÉÒÔ¾èÖú£¬Ö§³ÖÎÒÃǵĹ«ÒæÊÂÒµ¡£

1Ôª 10Ôª 50Ôª





ÈÏÖ¤Â룺  ÑéÖ¤Âë,¿´²»Çå³þ?Çëµã»÷Ë¢ÐÂÑéÖ¤Âë ±ØÌî



  ÇóÖª ÎÄÕ ÎÄ¿â Lib ÊÓÆµ iPerson ¿Î³Ì ÈÏÖ¤ ×Éѯ ¹¤¾ß ½²×ù Model Center   Code  
»áÔ±   
   
 
     
   
 ¶©ÔÄ
  ¾èÖú
ʹÓÃPython½øÐв¢·¢±à³Ì
 
  2367  次浏览      27
 2019-1-14 
 
±à¼­ÍƼö:
À´Ô´csdn £¬ÎÄÖÐPythonϵĸ÷ÖÖ²¢·¢·½Ê½£¬°¸Àý˵Ã÷£¬½éÉܽÏΪÏêϸ£¬¸ü¶àÇë²Î¿¼ÏÂÎÄ¡£

²¢·¢·½Ê½

Ị̈߳¨Thread£©

¶àÏ̼߳¸ºõÊÇÿһ¸ö³ÌÐòÔ³ÔÚʹÓÃÿһÖÖÓïÑÔʱ¶¼»áÊ×ÏÈÏëµ½ÓÃÓÚ½â¾ö²¢·¢µÄ¹¤¾ß£¨JS³ÌÐòÔ±Çë»Ø±Ü£©£¬Ê¹ÓöàÏ߳̿ÉÒÔÓÐЧµÄÀûÓÃCPU×ÊÔ´£¨PythonÀýÍ⣩¡£È»¶ø¶àÏß³ÌËù´øÀ´µÄ³ÌÐòµÄ¸´ÔÓ¶ÈÒ²²»¿É±ÜÃ⣬ÓÈÆäÊǶԾºÕù×ÊÔ´µÄͬ²½ÎÊÌâ¡£

È»¶øÔÚpythonÖÐÓÉÓÚʹÓÃÁËÈ«¾Ö½âÊÍËø£¨GIL£©µÄÔ­Òò£¬´úÂë²¢²»ÄÜͬʱÔÚ¶àºËÉϲ¢·¢µÄÔËÐУ¬Ò²¾ÍÊÇ˵£¬PythonµÄ¶àÏ̲߳»Äܲ¢·¢£¬ºÜ¶àÈ˻ᷢÏÖʹÓöàÏß³ÌÀ´¸Ä½ø×Ô¼ºµÄPython´úÂëºó£¬³ÌÐòµÄÔËÐÐЧÂÊȴϽµÁË£¬ÕâÊǶàôµ°ÌÛµÄÒ»¼þÊÂѽ£¡Èç¹ûÏëÁ˽â¸ü¶àϸ½Ú£¬ÍƼöÔĶÁÕâÆªÎÄÕ¡£Êµ¼ÊÉÏʹÓöàÏ̵߳ıà³ÌÄ£ÐÍÊǺÜÀ§Äѵ쬳ÌÐòÔ±ºÜÈÝÒ×·¸´í£¬Õâ²¢²»ÊdzÌÐòÔ±µÄ´íÎó£¬ÒòΪ²¢ÐÐ˼άÊÇ·´ÈËÀàµÄ£¬ÎÒÃÇ´ó¶àÊýÈ˵Ä˼άÊÇ´®ÐУ¨¾«Éñ·ÖÁѲ»ÌÖÂÛ£©£¬¶øÇÒ·ëŵÒÀÂüÉè¼ÆµÄ¼ÆËã»ú¼Ü¹¹Ò²ÊÇÒÔ˳ÐòÖ´ÐÐΪ»ù´¡µÄ¡£ËùÒÔÈç¹ûÄã×ÜÊDz»ÄܰÑÄãµÄ¶àÏ̳߳ÌÐò¸ã¶¨£¬¹§Ï²Ä㣬ÄãÊǸö˼άÕý³£µÄ³ÌÐòÔ³£º£©

PythonÌṩÁ½×éÏ̵߳Ľӿڣ¬Ò»×éÊÇthreadÄ£¿é£¬Ìṩ»ù´¡µÄ£¬µÍµÈ¼¶£¨Low Level£©½Ó¿Ú£¬Ê¹ÓÃFunction×÷ΪÏ̵߳ÄÔËÐÐÌå¡£»¹ÓÐÒ»×éÊÇthreadingÄ£¿é£¬Ìṩ¸üÈÝÒ×ʹÓõĻùÓÚ¶ÔÏóµÄ½Ó¿Ú£¨ÀàËÆÓÚJava£©£¬¿ÉÒԼ̳ÐThread¶ÔÏóÀ´ÊµÏÖỊ̈߳¬»¹ÌṩÁËÆäËüһЩÏß³ÌÏà¹ØµÄ¶ÔÏó£¬ÀýÈçTimer£¬Lock

ʹÓÃthreadÄ£¿éµÄÀý×Ó

import thread
def worker():
"""thread worker function"""
print 'Worker'
thread.start_new_thread(worker)

 

ʹÓÃthreadingÄ£¿éµÄÀý×Ó

import threading
def worker():
"""thread worker function"""
print 'Worker'
t = threading.Thread(target=worker)
t.start()

 

»òÕßJava Style

import threading
class worker(threading.Thread):
def__init__(self):
pass
def run():
"""thread worker function"""
print 'Worker'

t=worker()
t.start()

½ø³Ì £¨Process£©

ÓÉÓÚǰÎÄÌáµ½µÄÈ«¾Ö½âÊÍËøµÄÎÊÌ⣬PythonϱȽϺõIJ¢Ðз½Ê½ÊÇʹÓÃ¶à½ø³Ì£¬ÕâÑù¿ÉÒԷdz£ÓÐЧµÄʹÓÃCPU×ÊÔ´£¬²¢ÊµÏÖÕæÕýÒâÒåÉϵIJ¢·¢¡£µ±È»£¬½ø³ÌµÄ¿ªÏú±ÈÏß³ÌÒª´ó£¬Ò²¾ÍÊÇ˵Èç¹ûÄãÒª´´½¨ÊýÁ¿¾ªÈ˵IJ¢·¢½ø³ÌµÄ»°£¬ÐèÒª¿¼ÂÇÒ»ÏÂÄãµÄ»úÆ÷ÊDz»ÊÇÓÐÒ»¿ÅÇ¿´óµÄÐÄ¡£

PythonµÄmutliprocessÄ£¿éºÍthreading¾ßÓÐÀàËÆµÄ½Ó¿Ú¡£

from multiprocessing import Process

def worker():
"""thread worker function"""
print'Worker'
p=Process(target=worker)
p.start()
p.join()

 

ÓÉÓÚÏ̹߳²ÏíÏàͬµÄµØÖ·¿Õ¼äºÍÄڴ棬ËùÒÔÏß³ÌÖ®¼äµÄͨÐÅÊǷdz£ÈÝÒ׵ģ¬È»¶ø½ø³ÌÖ®¼äµÄͨОÍÒª¸´ÔÓһЩÁË¡£³£¼ûµÄ½ø³Ì¼äͨÐÅÓУ¬¹ÜµÀ£¬ÏûÏ¢¶ÓÁУ¬Socket½Ó¿Ú£¨TCP/IP£©µÈµÈ¡£

PythonµÄmutliprocessÄ£¿éÌṩÁË·â×°ºÃµÄ¹ÜµÀºÍ¶ÓÁУ¬¿ÉÒÔ·½±ãµÄÔÚ½ø³Ì¼ä´«µÝÏûÏ¢¡£

Python½ø³Ì¼äµÄͬ²½Ê¹ÓÃËø£¬ÕâÒ»µãºÈÏß³ÌÊÇÒ»ÑùµÄ¡£

ÁíÍ⣬Python»¹ÌṩÁ˽ø³Ì³ØPool¶ÔÏ󣬿ÉÒÔ·½±ãµÄ¹ÜÀíºÍ¿ØÖÆÏ̡߳£Ô¶³Ì·Ö²¼Ê½Ö÷»ú £¨Distributed Node£©

Ëæ×Å´óÊý¾Ýʱ´úµÄµ½ÁÙ£¬Ä¦¶û¶¨ÀíÔÚµ¥»úÉÏËÆºõÒѾ­Ê§È¥ÁËЧ¹û£¬Êý¾ÝµÄ¼ÆËãºÍ´¦ÀíÐèÒª·Ö²¼Ê½µÄ¼ÆËã»úÍøÂçÀ´ÔËÐУ¬³ÌÐò²¢ÐеÄÔËÐÐÔÚ¶à¸öÖ÷»ú½ÚµãÉÏ£¬ÒѾ­ÊÇÏÖÔÚµÄÈí¼þ¼Ü¹¹Ëù±ØÐ迼ÂǵÄÎÊÌâ¡£

Ô¶³ÌÖ÷»ú¼äµÄ½ø³Ì¼äͨÐÅÓм¸ÖÖ³£¼ûµÄ·½Ê½

TCP£¯IP

TCP£¯IPÊÇËùÓÐÔ¶³ÌͨÐŵĻù´¡£¬È»¶øAPI±È½ÏµÍ¼¶±ð£¬Ê¹ÓÃÆðÀ´±È½Ï·±Ëö£¬ËùÒÔÒ»°ã²»»á¿¼ÂÇ

Ô¶³Ì·½·¨µ÷Óà Remote Function Call

RPCÊÇÔçÆÚµÄÔ¶³Ì½ø³Ì¼äͨÐŵÄÊֶΡ£PythonÏÂÓÐÒ»¸ö¿ªÔ´µÄʵÏÖRPyC

Ô¶³Ì¶ÔÏóRemote Object

Ô¶³Ì¶ÔÏóÊǸü¸ß¼¶±ðµÄ·â×°£¬³ÌÐò¿ÉÒÔÏë²Ù×÷±¾µØ¶ÔÏóÒ»ÑùÈ¥²Ù×÷Ò»¸öÔ¶³Ì¶ÔÏóÔÚ±¾µØµÄ´úÀí¡£Ô¶³Ì¶ÔÏó×î¹ãΪʹÓõĹ淶 CORBA£¬CORBA×î´óµÄºÃ´¦ÊÇ¿ÉÒÔÔÚ²»Í¬ÓïÑÔºÍÆ½Ì¨ÖнøÐÐͨÐÅ¡£µ±Èò»ÓõÄÓïÑÔºÍÆ½Ì¨»¹ÓÐһЩ¸÷×ÔµÄÔ¶³Ì¶ÔÏóʵÏÖ£¬ÀýÈçJavaµÄRMI£¬MSµÄDCOM

PythonµÄ¿ªÔ´ÊµÏÖ£¬ÓÐÐí¶à¶ÔÔ¶³Ì¶ÔÏóµÄÖ§³Ö

Dopy

Fnorb£¨CORBA£©

ICE

omniORB £¨CORBA£©

Pyro

YAMI

ÏûÏ¢¶ÓÁÐ Message Queue

±ÈÆðRPC»òÕßÔ¶³Ì¶ÔÏó£¬ÏûÏ¢ÊÇÒ»ÖÖ¸üΪÁé»îµÄͨÐÅÊֶΣ¬³£¼ûµÄÖ§³ÖPython½Ó¿ÚµÄÏûÏ¢»úÖÆÓÐ

RabbitMQ

ZeroMQ

Kafka

AWS SQS £« BOTO

ÔÚÔ¶³ÌÖ÷»úÉÏÖ´Ðв¢·¢ºÍ±¾µØµÄ¶à½ø³Ì²¢Ã»Óзdz£´óµÄ²îÒ죬¶¼ÐèÒª½â¾ö½ø³Ì¼äͨÐŵÄÎÊÌâ¡£µ±È»¶ÔÔ¶³Ì½ø³ÌµÄ¹ÜÀíºÍЭµ÷±ÈÆð±¾µØÒª¸´ÔÓ¡£

PythonÏÂÓÐÐí¶à¿ªÔ´µÄ¿ò¼ÜÀ´Ö§³Ö·Ö²¼Ê½µÄ²¢·¢£¬ÌṩÓÐЧµÄ¹ÜÀíÊֶΰüÀ¨£º

Celery

CeleryÊÇÒ»¸ö·Ç³£³ÉÊìµÄPython·Ö²¼Ê½¿ò¼Ü£¬¿ÉÒÔÔÚ·Ö²¼Ê½µÄϵͳÖУ¬Òì²½µÄÖ´ÐÐÈÎÎñ£¬²¢ÌṩÓÐЧµÄ¹ÜÀíºÍµ÷¶È¹¦ÄÜ¡£

SCOOP

SCOOP £¨Scalable COncurrent Operations in Python£©Ìṩ¼òµ¥Ò×Óõķֲ¼Ê½µ÷Óýӿڣ¬Ê¹ÓÃFuture½Ó¿ÚÀ´½øÐв¢·¢¡£

Dispy

Ïà±ÈÆðCeleryºÍSCOOP£¬DispyÌṩ¸üΪÇáÁ¿¼¶µÄ·Ö²¼Ê½²¢ÐзþÎñ

PP

PP £¨Parallel Python£©ÊÇÁíÍâÒ»¸öÇáÁ¿¼¶µÄPython²¢ÐзþÎñ

Asyncoro

AsyncoroÊÇÁíÒ»¸öÀûÓÃGeneratorʵÏÖ·Ö²¼Ê½²¢·¢µÄPython¿ò¼Ü£¬

µ±È»»¹ÓÐÐí¶àÆäËüµÄϵͳ£¬ÎÒûÓÐÒ»Ò»Áгö

ÁíÍ⣬Ðí¶àµÄ·Ö²¼Ê½ÏµÍ³¶àÌṩÁ˶ÔPython½Ó¿ÚµÄÖ§³Ö£¬ÀýÈçSpark

αÏß³Ì £¨Pseudo£­Thread£©

»¹ÓÐÒ»ÖÖ²¢·¢Êֶβ¢²»³£¼û£¬ÎÒÃÇ¿ÉÒÔ³ÆÖ®ÎªÎ±Ị̈߳¬¾ÍÊÇ¿´ÉÏÈ¥ÏñÊÇỊ̈߳¬Ê¹ÓõĽӿÚÀàËÆÏ߳̽ӿڣ¬µ«ÊÇʵ¼ÊʹÓ÷ÇÏ̵߳ķ½Ê½£¬¶ÔÓ¦µÄÏ߳̿ªÏúÒ²²»´æµÄ¡£

greenlet

greenletÌṩÇáÁ¿¼¶µÄcoroutinesÀ´Ö§³Ö½ø³ÌÄڵIJ¢·¢¡£

greenletÊÇStacklessµÄÒ»¸ö¸±²úÆ·£¬Ê¹ÓÃtaskletÀ´Ö§³ÖÒ»Öб»³ÆÖ®ÎªÎ¢Ị̈߳¨mirco£­thread£©µÄ¼¼Êõ£¬ÕâÀïÊÇÒ»¸öʹÓÃgreenletµÄαÏ̵߳ÄÀý×Ó

from greenlet import greenlet

def test1():
print 12
gr2.switch()
print34

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

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

 

ÔËÐÐÒÔÉϳÌÐòµÃµ½ÈçϽá¹û£º


12
56
34

 

αÏß³Ìgr1 switch»á´òÓ¡12£¬È»ºóµ÷ÓÃgr2 switchµÃµ½56£¬È»ºóswitch»Øµ½gr1£¬´òÓ¡34£¬È»ºóαÏß³Ìgr1½áÊø£¬³ÌÐòÍ˳ö£¬ËùÒÔ78ÓÀÔ¶²»»á±»´òÓ¡¡£Í¨¹ýÕâ¸öÀý×ÓÎÒÃÇ¿ÉÒÔ¿´³ö£¬Ê¹ÓÃαỊ̈߳¬ÎÒÃÇ¿ÉÒÔÓÐЧµÄ¿ØÖƳÌÐòµÄÖ´ÐÐÁ÷³Ì£¬µ«ÊÇαÏ̲߳¢²»´æÔÚÕæÕýÒâÒåÉϵIJ¢·¢¡£

eventlet£¬geventºÍconcurence¶¼ÊÇ»ùÓÚgreenletÌṩ²¢·¢µÄ¡£

eventlet

eventletÊÇÒ»¸öÌá¹©ÍøÂçµ÷Óò¢·¢µÄPython¿â£¬Ê¹ÓÃÕß¿ÉÒÔÒÔ·Ç×èÈûµÄ·½Ê½À´µ÷ÓÃ×èÈûµÄIO²Ù×÷¡£

import eventlet
from eventlet.green import urllib2

urls=['http://www.google.com', 'http://www.example.com', 'http://www.python.org']

def fetch(url):
return urllib2.urlopen(url).read()

pool=eventlet.GreenPool()

for body in pool.imap(fetch,?urls):
print("got body", len(body))

 

Ö´Ðнá¹ûÈçÏÂ


('got body', 17629)
('got body', 1270)
('got body', 46949)

 

eventletΪÁËÖ§³ÖgeneratorµÄ²Ù×÷¶Ôurllib2×öÁËÐ޸ģ¬½Ó¿ÚºÍurllib2ÊÇÒ»Öµġ£ÕâÀïµÄGreenPoolºÍPythonµÄPool½Ó¿ÚÒ»Ö¡£

gevent

geventºÍeventletÀàËÆ£¬¹ØÓÚËüÃǵIJîÒì´ó¼Ò¿ÉÒԲο¼ÕâÆªÎÄÕÂ

import gevent
from gevent import socket
urls = ['www.google.com', 'www.example.com', 'www.python.org']
jobs = [gevent.spawn(socket.gethostbyname, url) for url in urls]
gevent.joinall(jobs, timeout=2)

print [job.value for job in jobs]

 

 

Ö´Ðнá¹ûÈçÏ£º

['206.169.145.226', '93.184.216.34', '23.235.39.223']

 

concurence

concurenceÊÇÁíÍâÒ»¸öÀûÓÃgreenletÌá¹©ÍøÂç²¢·¢µÄ¿ªÔ´¿â£¬ÎÒûÓÐÓùý£¬´ó¼Ò¿ÉÒÔ×Ô¼º³¢ÊÔһϡ£

ʵսÔËÓÃ

ͨ³£ÐèÒªÓõ½²¢·¢µÄ³¡ºÏÓÐÁ½ÖÖ£¬Ò»ÖÖÊǼÆËãÃܼ¯ÐÍ£¬Ò²¾ÍÊÇ˵ÄãµÄ³ÌÐòÐèÒª´óÁ¿µÄCPU×ÊÔ´;ÁíÒ»ÖÖÊÇIOÃܼ¯ÐÍ£¬³ÌÐò¿ÉÄÜÓдóÁ¿µÄ¶Áд²Ù×÷£¬°üÀ¨¶ÁдÎļþ£¬ÊÕ·¢ÍøÂçÇëÇóµÈµÈ¡£

¼ÆËãÃܼ¯ÐÍ

¶ÔÓ¦¼ÆËãÃܼ¯Ð͵ÄÓ¦Óã¬ÎÒÃÇÑ¡ÓÃÖøÃûµÄÃÉÌØ¿¨ÂåËã·¨À´¼ÆËãPIÖµ¡£»ù±¾Ô­ÀíÈçÏÂ

ÃÉÌØ¿¨ÂåËã·¨ÀûÓÃͳ¼ÆÑ§Ô­ÀíÀ´Ä£Äâ¼ÆËãÔ²ÖÜÂÊ£¬ÔÚÒ»¸öÕý·½ÐÎÖУ¬Ò»¸öËæ»úµÄµãÂäÔÚ1/4Ô²µÄÇøÓò£¨ºìÉ«µã£©µÄ¸ÅÂÊÓëÆäÃæ»ý³ÉÕý±È¡£Ò²¾Í¸Ã¸ÅÂÊ p £½ Pi £ª R£ªR £¯4 ?£º R£ª R £¬ ÆäÖÐRÊÇÕý·½Ðεı߳¤£¬Ô²µÄ°ë¾¶¡£Ò²¾ÍÊÇ˵¸Ã¸ÅÂÊÊÇÔ²ÖÜÂʵÄ1/4, ÀûÓÃÕâ¸ö½áÂÛ£¬Ö»ÒªÎÒÃÇÄ£Äâ³öµãÂäÔÚËÄ·ÖÖ®Ò»Ô²ÉϵĸÅÂʾͿÉÒÔÖªµÀÔ²ÖÜÂÊÁË£¬ÎªÁ˵õ½Õâ¸ö¸ÅÂÊ£¬ÎÒÃÇ¿ÉÒÔͨ¹ý´óÁ¿µÄʵÑ飬Ҳ¾ÍÊÇÉú³É´óÁ¿µÄµã£¬¿´¿´Õâ¸öµãÔÚÄĸöÇøÓò£¬È»ºóͳ¼Æ³ö½á¹û¡£

»ù±¾Ëã·¨ÈçÏ£º

from math import hypot
from random import random

def test(tries):
return sum(hypot(random(), random()) < 1for_in range(tries))

 

ÕâÀïtest·½·¨×öÁËn£¨tries£©´ÎÊÔÑ飬·µ»ØÂäÔÚËÄ·ÖÖ®Ò»Ô²ÖеĵãµÄ¸öÊý¡£ÅжϷ½·¨ÊǼì²é¸Ãµãµ½Ô²ÐĵľàÀ룬Èç¹ûСÓÚRÔòÊÇÔÚÔ²ÉÏ¡£

ͨ¹ý´óÁ¿µÄ²¢·¢£¬ÎÒÃÇ¿ÉÒÔ¿ìËÙµÄÔËÐжà´ÎÊÔÑ飬ÊÔÑéµÄ´ÎÊýÔ½¶à£¬½á¹ûÔ½½Ó½üÕæÊµµÄÔ²ÖÜÂÊ¡£

ÕâÀï¸ø³ö²»Í¬²¢·¢·½·¨µÄ³ÌÐò´úÂë

·Ç²¢·¢

ÎÒÃÇÏÈÔÚµ¥Ị̈߳¬µ«½ø³ÌÔËÐУ¬¿´¿´ÐÔÄÜÈçºÎ

from math import hypot
from random import random
import eventlet
import time

def test(tries):
return sum(hypot(random(), random()) < 1 for _ in range(tries))

def calcPi(nbFutures, tries):
ts = time.time()
result = map(test, [tries] * nbFutures)

ret = 4. * sum(result) / float(nbFutures * tries)
span = time.time() - ts
print "time spend ", span
return ret

print calcPi(3000,4000)

 

¶àÏß³Ì thread

ΪÁËʹÓÃÏ̳߳أ¬ÎÒÃÇÓÃmultiprocessingµÄdummy°ü£¬ËüÊǶԶàÏ̵߳ÄÒ»¸ö·â×°¡£×¢ÒâÕâÀï´úÂëËäȻһ¸ö×ÖµÄûÓÐÌáµ½Ị̈߳¬µ«ËüÇ§ÕæÍòÈ·ÊǶàÏ̡߳£

ͨ¹ý²âÊÔÎÒÃÇ¿ª£¨jing£©ÐÄ£¨ya£©µÄ·¢ÏÖ£¬¹ûÈ»²»³öËùÁÏ£¬µ±Ï̳߳ØÎª1ÊÇ£¬ËüµÄÔËÐнá¹ûºÍûÓв¢·¢Ê±Ò»Ñù£¬µ±ÎÒÃǰÑÏ̳߳ØÊý×ÖÉèÖÃΪ5ʱ£¬ºÄʱ¼¸ºõÊÇûÓв¢·¢µÄ2±¶£¬ÎҵIJâÊÔÊý¾Ý´Ó5Ãëµ½9Ãë¡£ËùÒÔ¶ÔÓÚ¼ÆËãÃܼ¯Ð͵ÄÈÎÎñ£¬»¹ÊÇ·ÅÆú¶àḬ̈߳ɡ£

from multiprocessing.dummy import Pool

from math import hypot
from random import random
import time

def test(tries):
return sum(hypot(random(), random()) < 1 for _ in range(tries))

def calcPi(nbFutures, tries):
ts = time.time()
p = Pool(1)
result = p.map(test, [tries] * nbFutures)
ret = 4. * sum(result) / float(nbFutures * tries)
span = time.time() - ts
print "time spend ", span
return ret

if __name__ == '__main__':
p = Pool()
print("pi = {}".format(calcPi(3000, 4000)))

 

¶à½ø³Ì multiprocess

ÀíÂÛÉ϶ÔÓÚ¼ÆËãÃܼ¯Ð͵ÄÈÎÎñ£¬Ê¹ÓÃ¶à½ø³Ì²¢·¢±È½ÏºÏÊÊ£¬ÔÚÒÔϵÄÀý×ÓÖУ¬½ø³Ì³ØµÄ¹æÄ£ÉèÖÃΪ5£¬Ð޸Ľø³Ì³ØµÄ´óС¿ÉÒÔ¿´µ½¶Ô½á¹ûµÄÓ°Ï죬µ±½ø³Ì³ØÉèÖÃΪ1ʱ£¬ºÍ¶àÏ̵߳Ľá¹ûËùÐèµÄʱ¼äÀàËÆ£¬ÒòΪÕâʱºò²¢²»´æÔÚ²¢·¢£»µ±ÉèÖÃΪ2ʱ£¬ÏìӦʱ¼äÓÐÁËÃ÷ÏԵĸĽø£¬ÊÇ֮ǰûÓв¢·¢µÄÒ»°ë£»È»¶ø¼ÌÐøÀ©´ó½ø³Ì³Ø¶ÔÐÔÄÜÓ°Ïì²¢²»´ó£¬ÉõÖÁÓÐËùϽµ£¬Ò²ÐíÎÒµÄApple AirµÄCPUÖ»ÓÐÁ½¸öºË£¿

µ±ÐÄ£¬Èç¹ûÄãÉèÖÃÒ»¸ö·Ç³£´óµÄ½ø³Ì³Ø£¬Äã»áÓöµ½ Resource temporarily unavailableµÄ´íÎó£¬ÏµÍ³²¢²»ÄÜÖ§³Ö´´½¨Ì«¶àµÄ½ø³Ì£¬±Ï¾¹×ÊÔ´ÊÇÓÐÏ޵ġ£

from multiprocessing import Pool

from math import hypot
from random import random
import time

def test(tries):
return sum(hypot(random(), random()) < 1 for _ in range(tries))

def calcPi(nbFutures, tries):
ts = time.time()
p = Pool(5)
result = p.map(test, [tries] * nbFutures)
ret = 4. * sum(result) / float(nbFutures * tries)
span = time.time() - ts
print "time spend ", span
return ret

if __name__ == '__main__':
print("pi = {}".format(calcPi(3000, 4000)))

 

gevent £¨Î±Ị̈߳©

²»ÂÛÊÇgevent»¹ÊÇeventlet£¬ÒòΪ²»´æÔÚʵ¼ÊµÄ²¢·¢£¬ÏìӦʱ¼äºÍûÓв¢·¢Çø±ð²»´ó£¬Õâ¸öºÍ²âÊÔ½á¹ûÒ»Ö¡£

import gevent
from math import hypot
from random import random
import time

def test(tries):
return sum(hypot(random(), random()) < 1 for _ in range(tries))

def calcPi(nbFutures, tries):
ts = time.time()
jobs = [gevent.spawn(test, t) for t in [tries] * nbFutures]
gevent.joinall(jobs, timeout=2)
ret = 4. * sum([job.value for job in jobs]) / float(nbFutures * tries)
span = time.time() - ts
print "time spend ", span
return ret

print calcPi(3000,4000)

eventlet £¨Î±Ị̈߳©

from math import hypot
from random import random
import eventlet
import time

def test(tries):
return sum(hypot(random(), random()) < 1 for _ in range(tries))

def calcPi(nbFutures, tries):
ts = time.time()
pool = eventlet.GreenPool()
result = pool.imap(test, [tries] * nbFutures)

ret = 4. * sum(result) / float(nbFutures * tries)
span = time.time() - ts
print "time spend ", span
return ret

print calcPi(3000,4000)

 

SCOOP

SCOOPÖеÄFuture½Ó¿Ú·ûºÏPEP-3148µÄ¶¨Ò壬Ҳ¾ÍÊÇÔÚPython3ÖÐÌṩµÄFuture½Ó¿Ú¡£

ÔÚȱʡµÄSCOOPÅäÖû·¾³Ï£¨µ¥»ú£¬4¸öWorker£©£¬²¢·¢µÄÐÔÄÜÓÐÌá¸ß£¬µ«ÊDz»ÈçÁ½¸ö½ø³Ì³ØÅäÖÃµÄ¶à½ø³Ì¡£

from math import hypot
from random import random
from scoop import futures

import time

def test(tries):
return sum(hypot(random(), random()) < 1 for _ in range(tries))

def calcPi(nbFutures, tries):
ts = time.time()
expr = futures.map(test, [tries] * nbFutures)
ret = 4. * sum(expr) / float(nbFutures * tries)
span = time.time() - ts
print "time spend ", span
return ret

if __name__ == "__main__":
print("pi = {}".format(calcPi(3000, 4000)))

 

Celery

ÈÎÎñ´úÂë

from celery import Celery

from math import hypot
from random import random

app = Celery('tasks', backend='amqp', broker='amqp://guest@localhost//')
app.conf.CELERY_RESULT_BACKEND = 'db+sqlite:///results.sqlite'

@app.task
def test(tries):
return sum(hypot(random(), random()) < 1 for _ in range(tries))

 

¿Í»§¶Ë´úÂë

from celery import group
from tasks import test

import time

def calcPi(nbFutures, tries):
ts = time.time()
result = group(test.s(tries) for i in xrange(nbFutures))().get()

ret = 4. * sum(result) / float(nbFutures * tries)
span = time.time() - ts
print "time spend ", span
return ret

print calcPi(3000, 4000)

 

ʹÓÃCelery×ö²¢·¢µÄ²âÊÔ½á¹û³öºõÒâÁÏ£¨»·¾³Êǵ¥»ú£¬4freforkµÄ²¢·¢£¬ÏûÏ¢brokerÊÇrabbitMQ£©£¬ÊÇËùÓвâÊÔÓÃÀýÀï×îÔã¸âµÄ£¬ÏìӦʱ¼äÊÇûÓв¢·¢µÄ5¡«6±¶¡£ÕâÒ²ÐíÊÇÒòΪ¿ØÖÆÐ­µ÷µÄ¿ªÏúÌ«´ó¡£¶ÔÓÚÕâÑùµÄ¼ÆËãÈÎÎñ£¬CeleryÒ²Ðí²»ÊÇÒ»¸öºÃµÄÑ¡Ôñ¡£

asyncoro

AsyncoroµÄ²âÊÔ½á¹ûºÍ·Ç²¢·¢±£³ÖÒ»Ö¡£

import asyncoro

from math import hypot
from random import random
import time

def test(tries):
yield sum(hypot(random(), random()) < 1 for _ in range(tries))


def calcPi(nbFutures, tries):
ts = time.time()
coros = [ asyncoro.Coro(test,t) for t in [tries] * nbFutures]
ret = 4. * sum([job.value() for job in coros]) / float(nbFutures * tries)
span = time.time() - ts
print "time spend ", span
return ret

print calcPi(3000,4000)

IOÃܼ¯ÐÍ

IOÃܼ¯Ð͵ÄÈÎÎñÊÇÁíÒ»ÖÖ³£¼ûµÄÓÃÀý£¬ÀýÈçÍøÂçWEB·þÎñÆ÷¾ÍÊÇÒ»¸öÀý×Ó£¬Ã¿ÃëÖÓÄÜ´¦Àí¶àÉÙ¸öÇëÇóʱWEB·þÎñÆ÷µÄÖØÒªÖ¸±ê¡£

ÎÒÃǾÍÒÔÍøÒ³¶ÁÈ¡×÷Ϊ×î¼òµ¥µÄÀý×Ó

from math import hypot
import time
import urllib2

urls = ['http://www.google.com', 'http://www.example.com', 'http://www.python.org']

def test(url):
return urllib2.urlopen(url).read()

def testIO(nbFutures):
ts = time.time()
map(test, urls * nbFutures)

span = time.time() - ts
print "time spend ", span

testIO(10)

 

ÔÚ²»Í¬²¢·¢¿âϵĴúÂ룬ÓÉÓڱȽÏÀàËÆ£¬ÎҾͲ»Ò»Ò»Áгö¡£´ó¼Ò¿ÉÒԲο¼¼ÆËãÃܼ¯ÐÍÖдúÂë×ö²Î¿¼¡£

ͨ¹ý²âÊÔÎÒÃÇ¿ÉÒÔ·¢ÏÖ£¬¶ÔÓÚIOÃܼ¯Ð͵ÄÈÎÎñ£¬Ê¹ÓöàỊ̈߳¬»òÕßÊÇ¶à½ø³Ì¶¼¿ÉÒÔÓÐЧµÄÌá¸ß³ÌÐòµÄЧÂÊ£¬¶øÊ¹ÓÃαÏß³ÌÐÔÄÜÌáÉý·Ç³£ÏÔÖø£¬eventlet±ÈûÓв¢·¢µÄÇé¿öÏ£¬ÏìӦʱ¼ä´Ó9ÃëÌá¸ßµ½0.03Ã롣ͬʱeventlet£¯geventÌṩÁË·Ç×èÈûµÄÒì²½µ÷ÓÃģʽ£¬·Ç³£·½±ã¡£ÕâÀïÍÆ¼öʹÓÃÏ̻߳òÕßαỊ̈߳¬ÒòΪÔÚÏìӦʱ¼äÀàËÆµÄÇé¿öÏ£¬Ï̺߳ÍαÏß³ÌÏûºÄµÄ×ÊÔ´¸üÉÙ¡£

×ܽá

PythonÌṩÁ˲»Í¬µÄ²¢·¢·½Ê½£¬¶ÔÓ¦ÓÚ²»Í¬µÄ³¡¾°£¬ÎÒÃÇÐèҪѡÔñ²»Í¬µÄ·½Ê½½øÐв¢·¢¡£Ñ¡ÔñºÏÊʵķ½Ê½£¬²»µ«Òª¶Ô¸Ã·½·¨µÄÔ­ÀíÓÐËùÁ˽⣬»¹Ó¦¸Ã×öһЩ²âÊÔºÍÊÔÑ飬Êý¾Ý²ÅÊÇÄã×öÑ¡ÔñµÄ×îºÃ²Î¿¼¡£

 

   
2367 ´Îä¯ÀÀ       27
Ïà¹ØÎÄÕÂ

ÊÖ»úÈí¼þ²âÊÔÓÃÀýÉè¼ÆÊµ¼ù
ÊÖ»ú¿Í»§¶ËUI²âÊÔ·ÖÎö
iPhoneÏûÏ¢ÍÆËÍ»úÖÆÊµÏÖÓë̽ÌÖ
AndroidÊÖ»ú¿ª·¢£¨Ò»£©
Ïà¹ØÎĵµ

Android_UI¹Ù·½Éè¼Æ½Ì³Ì
ÊÖ»ú¿ª·¢Æ½Ì¨½éÉÜ
androidÅÄÕÕ¼°ÉÏ´«¹¦ÄÜ
Android½²ÒåÖÇÄÜÊÖ»ú¿ª·¢
Ïà¹Ø¿Î³Ì

Android¸ß¼¶Òƶ¯Ó¦ÓóÌÐò
Androidϵͳ¿ª·¢
AndroidÓ¦Óÿª·¢
ÊÖ»úÈí¼þ²âÊÔ