ä»ç»
ä¼¼ä¹æå¾å¤çæ¶ææ¤
建议å没æå·¥ä½çä¾åã没æåå¨ä¸é¢ï¼çè³å¤éççæ¡ï¼è¿æ¯é¢æå å失æåä¸å®ãç±äºpythonç±å¥½è
ï¼æ们åºè¯¥æ¯ææ们çå
ç½®åºï¼å¹¶åæ¶å¹¶è¡å¤çååæ¥ä»æ¥é½ä¸æ¯å°äºï¼æç¸ä¿¡å®å¯ä»¥å¶æçç¢ä¸éå½ç设计ãè¿æ¯å¾éè¦çç°ä»£å¤æ ¸æ¶æï¼å¹¶ä¸ä¸è½å¤underlineï¼è¯è½å¦æ¤
CodeGo.netï¼æè¿è¿æ»¡è¶³å¤å¤çåºï¼å®ä»ç¶æ¯å¤äºèµ·æ¥é¶æ®µçé¶æ®µä¸ä¸å°ç¼ºé·ï¼é误ï¼å¹¶æ£å¨é¢åå½æ°å¼ç¼ç¨ï¼æ讨åï¼ãç®åæè¿æ¯æ¯è¾å欢ç«ç°å
µæ¨¡åï¼è¿æ¯é¥é¥é¢å
å
¶å¯¹å¤éçå æ æ³å¨æå¡å¨è¿è¡æ¶å
±äº«æ°å建ç对象å¤å¤çç严ééå¶ãâ注åâç管ç对象åªè½å®é
注åä¸ä¸ªå¯¹è±¡ä¹å管çï¼ææå¡å¨ï¼å¼å§æ°è½å¤äºï¼æ´å¤ç代ç ï¼
Server.py
from multiprocessing.managers import SyncManager
class MyManager(SyncManager):
pass
syncdict = {}
def get_dict():
return syncdict
if __name__ == "__main__":
MyManager.register("syncdict", get_dict)
manager = MyManager(("127.0.0.1", 5000), authkey="password")
manager.start()
raw_input("Press any key to kill server".center(50, "-"))
manager.shutdown()
å¤éçSyncManagerï¼å¯ä»¥æä¾åæ¥å
±äº«å¯¹è±¡çServer.pyå¨ä¸é¢ç代ç 示ä¾ãæ¤ä»£ç å°ä¸è½å·¥ä½å¨è§£éå¤å¤çåºæ¯å¦ä½æ¾å°âå¯èµåâ为æ¯ä¸ªæ³¨åç对象ç¸å½æ£æçè¿è¡ãè¿è¡Server.pyå°å¯å¨ä¸ä¸ªå®å¶SyncManagerå
±äº«å¤ä¸ªè¿ç¨çsyncdictåå
¸ï¼å¹¶ä¸å¯ä»¥è¿æ¥å°å®¢æ·ç«¯æºæè
æºå¨ä¸ï¼æè
ï¼å¦æè¿è¡å¨æ¯åç¯ï¼å
¶ä»æºå¨çå
¶ä»çIPå°åãå¨è¿ç§æ
åµä¸ï¼æå¡å¨è¿è¡å¨ç¯åï¼127.0.0.1ï¼ç«¯å£5000ãæä½syncdictå½ä½¿ç¨authkey使ç¨å®å
¨è¿æ¥ãå½ä»»ä½ä¸ä¸ªé®è¢«æä¸ç管çæ¯å
³æºã
Client.py
from multiprocessing.managers import SyncManager
import sys, time
class MyManager(SyncManager):
pass
MyManager.register("syncdict")
if __name__ == "__main__":
manager = MyManager(("127.0.0.1", 5000), authkey="password")
manager.connect()
syncdict = manager.syncdict()
print "dict = %s" % (dir(syncdict))
key = raw_input("Enter key to update: ")
inc = float(raw_input("Enter increment: "))
sleep = float(raw_input("Enter sleep time (sec): "))
try:
#if the key doesn't exist create it
if not syncdict.has_key(key):
syncdict.update([(key, 0)])
#increment key value every sleep seconds
#then print syncdict
while True:
syncdict.update([(key, syncdict.get(key) + inc)])
time.sleep(sleep)
print "%s" % (syncdict)
except KeyboardInterrupt:
print "Killed client"
客æ·ç«¯ç«¯è¿å¿
é¡»å建ä¸ä¸ªèªå®ä¹çSyncManagerï¼æ³¨åâsyncdictâï¼è¿ä¸ªæ²¡æä¼ å
¥ä¸ä¸ªå¯è°ç¨æ¥æ£ç´¢å
±äº«åå
¸ãå®å®å¶å°5000端å£çç¯åIPå°åï¼127.0.0.1ï¼åauthkey建ç«ä¸ç®¡ççå®å
¨è¿æ¥å¼å§Server.pyãå®éè¿è°ç¨æ³¨åçè°ç¨ä¸ç管çå¨æ£ç´¢å
±äº«åå
¸syncdictãå®æ示å¦ä¸ï¼
å¨syncdictçå
³é®ï¼æä½ä¸
该款项ç±é®è®¿é®æ¶çå¼æ¯ä¸ªå¨æ
å¨å ç§éå
æ¯ä¸ªå¨æsleepçéé¢
ç¶åï¼å®¢æ·ç«¯ç«¯ä¼æ£æ¥çæ¯å¦åå¨çå
³é®ãå¦æå®ä¸å®å建çsyncdictå
³é®ãç¶åï¼å®¢æ·ç«¯ç«¯è¿å
¥ä¸ä¸ªâ没å®æ²¡äºâ循ç¯ï¼å®ä¼æ´æ°å¯é¥çå¼ç±æå®çéé¢sleepï¼å¹¶æå°syncdictåªæ¯ç´å°KeyboardInterruptåçï¼CTRL
+Cï¼éå¤æ¤è¿ç¨ã
æ¼äººçé®é¢
该管çå¨å¯å¨ï¼å¦åä½ ä¼å¾å°å¼å¸¸ï¼å³ä½¿å¨ç®¡çå¨ä¸çç®å½è°ç¨å°±ä¼åç°ï¼å®ç¡®å®æ¯æ被注åå管ç人å¿
须被è°ç¨ã
该è¯å
¸çææçæä½ä¸å®è¦åçï¼ä¸æ¯åå
¸ï¼syncdict [âçç ´â]=2å°±ä¼å¤±è´¥çè·¯å¤å¤çå¨å
±äº«èªå®ä¹å¯¹è±¡ï¼
使ç¨SyncManagerçå°åè½»æ¼äººçé®é¢ï¼2ï¼é¤äºæ¼äººçé®é¢ï¼1é²æ¢ç±SyncManager.dictï¼ï¼è¢«æ³¨ååå
±äº«è¿åç代çã
ï¼SyncManager.dictï¼ï¼åªè½è¢«ç§°ä¸ºåç管çå¨å¯å¨ï¼å¹¶æ³¨ååªä¼å·¥ä½ç管çå¼å§ä¹åè¿æ ·SyncManager.dictï¼ï¼æ¯åå½æ°å¼ç¼ç¨åéè¿ä»£çè¿ç¨ä½ä¸ºä¸ä¸ªåææ¡£çä¾ååçæ¶åï¼
å¨æå¡å¨å客æ·ç«¯ç«¯å¿
须注åï¼å³ä½¿ç´è§å®ä¼çèµ·æ¥å客æ·ç«¯ç«¯å°åªè½å¤è¿æ¥å°ç®¡çåï¼ççåå§ï¼è¯·æ·»å å°æ¨çæ¿ææ¸
åå¤å¤çå¼å人åï¼
éå¹
æå¸æä½ å欢è¿ä¸ªç¸å½å½»åºï¼ç¨æåçï¼å°±åææãææä¸ä¸ªå¾å¤§çtroubleç´å¨æçèæµ·ï¼ä¸ºä»ä¹ææ£æäºè¿ä¹å¤çå¤å¤ç模åï¼å
¶ä¸ç«ç°å
µæ¯ä¸ä»¶è½»èæ举çï¼ç°å¨å¤äºäºè¿ä¸ªçæ¡æå·²ç»å»ä¸äºè¦å®³ãæå¸æè¿ç»å¦ä½æé«å¤å¤çå¨æ¨¡åï¼å 为æç¸ä¿¡å®æä¸ä¸ªå¾å¤§çæ¿è¯ºï¼ä½å¤äºèµ·æ¥é¶æ®µè¾¾ä¸å°ä»ä¹æ¯å¯è½çã尽管æè¿°çæ¼äººçé®é¢ï¼æ认为è¿ä»ç¶æ¯ä¸ä¸ªç¸å½å¯è¡çæ¿ä»£æ¹æ¡ï¼æ¯é常ç®åçãä½ å¯ä»¥SyncManager.dictï¼ï¼ï¼å¹¶æå®ä¼ éç»è¿ç¨ä½ä¸ºè¯¥ææ¡£æ¾ç¤ºæ¹å¼ï¼å®å¾å¯è½æ¯ä¸ä¸ªæ´ç®åç解å³æ¹æ¡ï¼æ ¹æ®æ¨çå®åªæ¯æè§ä¸èªç¶
2.
æ没æåå
¸éè¦è¢«æå¨é¦ä½å
±äº«ççç±åï¼ä½ å¯ä»¥ææ¯ä¸ä¸ªçº¿ç¨ç»´æ¤èªå·±çåå
¸ï¼å¹¶å¨çº¿ç¨å¤çæ个å«çº¿ç¨åå
¸å¨ä¸èµ·çåæ¨å¯æ¬å¹´åºå®ä¾ï¼
æä¸ç¥éå°åºä½ å¨åä»ä¹ï¼æ以请æçï¼æç书é¢è®¡åå¯è½æ æ³æ£å¸¸å·¥ä½ä¸åä¸å·®ãä»ä¹æç建议æ¯æ´å¤çæ¯ä¸ç§é«å±æ¬¡ç设计ç念ã
3.
æå°è´åäºä¸ä¸ªåç¬çè¿ç¨ï¼ä»¥ç»´æ¤âå
±äº«åå
¸âï¼ä¾å¦ï¼ xmlrpclib使代ç æä¾ç»å
¶ä»è¿ç¨å°éï¼éè¿xmlrpclibå¦æ´é²ä¸ä¸ªå½æ°ï¼è¯¥å½æ°key, incrementæ§è¡åä¸ä¸ªåæç¨çkeyåè¿åå¼ï¼ç¨è¯ä¹ç»èï¼æ¯å¦æ丢失çé¥åï¼çï¼çä¸ä¸ªé»è®¤å¼ï¼ï¼è¿åå³äºä½ çåºç¨ç¨åºçéæ±ã
é£ä¹ä½ ä»»ä½ä½ å欢çå
±äº«ä¸ç¨åå
¸è¿ç¨æ¹æ³ï¼ä»ä¸ä¸ªç®åçåå
¸ä¸ä¸ªå线ç¨çæå¡å¨ä¸ç´å°ä¸ä¸ªç®åçsqliteçæ°æ®åºï¼ççï¼ççï¼æå»ºè®®ä½ å¼å§ä¸ä»£ç âå°±è¿ä¹ç®åï¼ä½ å¯ä»¥å¾å°ç ´é¤âï¼åå³äºä½ æ¯å¦éè¦ä¸ä¸ªæ°¸ä¹
å
±äº«åå
¸ï¼ææä¹
æ§æ¯æ²¡æå¿
è¦ç»ä½ ï¼ï¼åï¼å¦æéè¦ä¼åã
4.
ååºäºéå½ç溶液ä¸ï¼ä»¥å¹¶è¡åå
¥çé®é¢ãæåäºé常快éçç 究ï¼åç°è¿ç¯æç« æ¯å¨æ示ä¸ä¸ªéå®/ä¿¡å·ç解å³æ¹æ¡ã ï¼
è½ç¶è¿ä¸ªä¾åæ¯ä¸æ¯ç¹å¼æ§çä¸æ¬åå
¸ï¼ææ¢è¯å®ï¼ä½ å¯ä»¥ç¼åä¸ä¸ªåºäºç±»çå
è£
对象ï¼ä»¥å¸®å©æ¨åºäºè¿ç§æ³æ³è¯å
¸çå·¥ä½ã
å¦æææä¸ä¸ªå欢è¿ä¸ªä»¥çº¿ç¨å®å
¨çæ¹å¼ï¼æåæ¯Pythonçä¿¡å·é解å³æ¹æ¡ã ï¼å设æçææ¯æ¯è¡ä¸éçãï¼æç¸ä¿¡ï¼ä¿¡å·éæ®éæ¾ç¼ï¼ç±äºå
¶æ§è´¨é»å¡çº¿ç¨çæçã
ä»ç½ç«ï¼
ä¿¡å·éæ¯ä¸ä¸ªæ¯è¾å
è¿çä¿¡å·éæä¸ä¸ªå
é¨ç计æ°å¨ï¼èä¸æ¯ä¸ä¸ªéæ å¿ï¼å¹¶ä¸å®åªæåå¦æè¶
è¿çº¿ç¨ç»å®æ°éçè¯å¾ä¿æä¿¡å·éãæ ¹æ®å¦ä½å¨ä¿¡å·é被åå§åï¼è¿å
许å¤ä¸ªçº¿ç¨è®¿é®ä»£ç 段
semaphore = threading.BoundedSemaphore()
semaphore.acquire() # decrements the counter
... access the shared resource; work with dictionary, add item or whatever.
semaphore.release() # increments the counter
温馨提示:答案为网友推荐,仅供参考