±à¼ÍƼö: |
À´Ô´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()
|
ÔËÐÐÒÔÉϳÌÐòµÃµ½ÈçϽá¹û£º
αÏß³Ì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ÌṩÁ˲»Í¬µÄ²¢·¢·½Ê½£¬¶ÔÓ¦ÓÚ²»Í¬µÄ³¡¾°£¬ÎÒÃÇÐèҪѡÔñ²»Í¬µÄ·½Ê½½øÐв¢·¢¡£Ñ¡ÔñºÏÊʵķ½Ê½£¬²»µ«Òª¶Ô¸Ã·½·¨µÄÔÀíÓÐËùÁ˽⣬»¹Ó¦¸Ã×öһЩ²âÊÔºÍÊÔÑ飬Êý¾Ý²ÅÊÇÄã×öÑ¡ÔñµÄ×îºÃ²Î¿¼¡£
|