1.ã¯ããã«
é£ã¶ããšãåŠãã 人ã¯ããéãããšã¯ãããŸãããããããååãšããŠãé£ã¹ãªãã人ã«å¯ŸããŠã岿 ¢ã§ãã£ãŠã¯ãªããŸãããã©ã¡ããããæ®éã®ããšã§ããã©ã¡ããå°æ¬ãããå°æ¬ãããŠããŸãã人ã«ãšã£ãŠãããã¯è·æ¥ãéžã¶ãããªãã®ã§ããããªãã¯ãåŸæ¥ããã€ãããããã©ã€ããŒã®ã©ã¡ããã§ããåãåç©ã®å Žåãããã¯åãã§ã-ããªãã¯ã¯ã·ããªãªã«ãã®ã©ã¡ããã§ããããªãã¡é£ã¶ãéããïŒéããïŒããããåœŒã®æŠå¿µãã«ããŽãªãŒãæ 床ãæèã®äžã§ç·æ§ã ãããã£ã©ã¯ã¿ãŒã«ç¹åŸŽãäžãã圌ãã«å¯ŸããŠåœŒèªèº«ã®æ 床ãçºéãããŸããã確ãã«ããã¥ã¢ã³ã¹ããããŸããã ããããããããããã¯ãã€ãããã®è·æ¥ãããç«æŽŸã§ããã³ããã¯ã§ãããããããã©ãã¯é転æãèªç©ºæ©ã®èšèšè ã«èª¬åŸããŠã¿ãŠãã ããïŒïŒãããŠãããã§è°è«ããã®ã¯é£ããã§ãïŒä»ã§ãå€ãã®å®å®é£è¡å£«ãããŸããã2çªç®ã®å¥³çã¯ãŸã ããŸããïŒ
ç§ãã¡ã¯ããã°ã©ããŒã§ããçšåºŠã¯ããŸããŸãããããŸãããã確ãã«ããã€ããããŸããã€ãŸããç§ãã¡ã¯ç°ãªã£ãŠãããããŸããŸãªæ¹æ³ã§èããããšãã§ããŸããããã°ã©ããŒãäžè²«ããŠããèããŠããªããšãã声æã¯ã人ãèµ°ãã ãã§ãããšããäºå®ãšåãããã«ãäžæ¹çã§ãæå®³ã§ãåæ¶çã§ãããããŸããåœŒã¯æã -ãããŠé£ã¶ããã€ãããã®ããã«å®æçã«è¡ã人ãããã°ãå®å®é£è¡å£«ã®ããã«æ°ãæéãç¶ç¶çã«è¡ã人ãããŸããäžè²«ããæèã®ã¢ã€ãã¢ã¯ã人éã®èœåãäœäžãããŸããããæç¹ã§ããã°ããã®éãããªãã¯ãããä¿¡ããããšããã§ããŸããããããã§ããããã¯å€ãããŸãã-ããã¯é ããæ©ãã人çãç ç²ã«ãªããšããäºå®ã«ã€ããŠã§ãã
Pythonã®Asyncioã¯ãæ¯å©çã«èšãã°ã誀ã£ã䞊åæèã®é£è¡ãæš¡å£ãããœãããŠã§ã¢ã¯ã©ããã§ããæãæ¯ã£ãŠããŠã³ããããããªãã®ã§ããããã¯æã ãé¢çœããŠäžåšçšã«èŠããŸããç¹å®ã®ç¶æ³ã§ã¯ãããã解決çã§ããæ°ŽããŸããè¶ããŠæ±ããããšãã§ããŸããã匷床ãèš±ãã°ãé£ã³è¶ããæ¹ãããã§ããããããããããããããã°ã©ããŒã¯åãæ¬ ããŠããŸããïŒ
課ããããããœãããŠã§ã¢ã¯ã©ããããç Žæ£ããŠããœãããŠã§ã¢ã«ãŒãã³ã®äžã«æ¥äžæããŠã¿ãŸãããããããŠãããããžã£ã³ãã§ã¯ãªãããããã¯ããã»ã©é«ããé·ããããªãããã«ããŸãããããã§ããç¹ã«ã¯ã©ãããšæ¯èŒããŠããã©ã€ãã§ããçµå±ã®ãšããããã€ãŠã¢ã¶ã€ã¹ããŒã¢ã¬ã¯ãµã³ããŒãã§ãããããïŒã¢ã¹ã¯ã¯å°åã®ã¢ã¶ã€ã¹ããŒåžè£å€æãšæ··åããªãã§ãã ãã;ïŒãŸãã¯åãã©ã€ãå åŒãåããŠç©ºäžã§æ°çŸã¡ãŒãã«ãå æããŸãããã¯ãããããŠçŸä»£ã®èªç©ºæ©ã®ãã¹ãã¯ãæ»èµ°è·¯ãšæ»èµ°è·¯ããã®çæéã®åé¢ããå§ãŸããŸãã
2.asyncioã䜿çšããéåžžã«åçŽãªäŸ
Pythonã§ã®é£è¡ããå§ããŸãããããã©ã€ãããã°ã©ã ã¯ç°¡åã§ãããã¥ãŒãºã©ã°ã«ãBlogãããNewsãããForumããšããååã®é£è¡æ©ããããŸãïŒãã ããã¹ãã€ããŒã®ç»åã®å ã®ããŒãžã§ã³ã§ã¯ã[1]ãåç §ããŠãã ããïŒã圌ãã¯åæã«é¢éžããŸãã誰ããç¹å®ã®æéå ã«ãã¹ã®ã»ã°ã¡ã³ããé£è¡ããããšãã°ãã»ã°ã¡ã³ãã®çªå·ãã«ããŒããããã©ã°ãæããå¿ èŠããããŸããããã¯3åå®è¡ããå¿ èŠããããŸãããããŠãçéžããã ãã§ãã
Pythonã§ã¯ããã®åäœã®ã¢ãã«ãèšè¿°ããããªã¹ã1ã®ã³ãŒãã«ãã£ãŠã·ãã¥ã¬ãŒããããŸãã
ãªã¹ã1.ã¹ãã€ããŒãã¬ãŒã³ã®Pythonã³ãŒã
import asyncio
import time
async def spider(site_name):
for page in range(1, 4):
await asyncio.sleep(1)
print(site_name, page)
spiders = [
asyncio.ensure_future(spider("Blog")),
asyncio.ensure_future(spider("News")),
asyncio.ensure_future(spider("Forum"))
]
start = time.time()
event_loop = asyncio.get_event_loop()
event_loop.run_until_complete(asyncio.gather(*spiders))
event_loop.close()
print("{:.2F}".format(time.time() - start))
ãã®ãããªããã©ã€ããã®ã·ãã¥ã¬ãŒã·ã§ã³çµæã¯æ¬¡ã®ãšããã§ãã
ããã°1
ãã¥ãŒã¹1
ãã©ãŒã©ã 1
ããã°2
ãã¥ãŒã¹2
ãã©ãŒã©ã 2
ããã°3
ãã¥ãŒã¹3
ãã©ãŒã©ã
33.00
ãªãããããããª[1]ã§è©³çްã«èª¬æãããŠããã®ããããããæ³ååãšåæã§ãç§ãã¡ã¿ããªïŒã·ããªãªã«åŸã£ãŠ-éåæïŒã®é£è¡ç§ãã¡3ããã¬ãŒã³ãã«ãªãasyncioã䜿çšããã«-èªåã¢ãã«ã«åºã¥ããŠç°ãªãæ¹æ³ã§æç€ºããŸããããšãã°ããªã¹ã2ã¯ããªãŒãããã³é å»¶ã®ã³ãŒãã瀺ããŠããŸããããã¯ããªã¹ã1ã®await asyncio.sleepïŒ1ïŒãšããè¡ã§è¡šããããasyncioã¢ãžã¥ãŒã«ããã®éåæé å»¶ã®é¡äŒŒç©ã§ãã
ãªã¹ã2.Pythonã®èªåé
å»¶ã³ãŒã
import time
class PSleep:
def __init__(self, t, p_FSM): self.SetTime = t; self.nState = 0; self.bIfLoop = False; self.p_mainFSM = p_FSM
def x1(self): return time.time() - self.t0 <= self.SetTime
def y1(self): self.t0 = time.time()
def loop(self):
if (self.nState == 0): self.y1(); self.nState = 1
elif (self.nState == 1):
if (not self.x1()): self.nState = 4
é å»¶å€ãšé å»¶ãªããžã§ã¯ããäœæãããªããžã§ã¯ããžã®ãã€ã³ã¿ã¯ãã¯ã©ã¹ã³ã³ã¹ãã©ã¯ã¿ãä»ããŠæž¡ãããŸãããã€ã³ã¿ã¯ãé å»¶ãåé€ããåŸãäœææã«åæ¢ããã芪ããã»ã¹ãç¶è¡ããããã»ã¹å¶åŸ¡æ©èœã«å¿ èŠã§ãã
ãªã¹ã3ã¯ãéåæã¹ãã€ããŒãã¬ãŒã³ã«å¯Ÿå¿ãããªãŒãããã³ã瀺ããŠããŸãïŒãªã¹ã1ãåç §ïŒãæãæªå€¢ã®ãããªå Žåã§ããPythonããã°ã©ãã³ã°ãšãŒã¹ãããã倢èŠãªãå¯èœæ§ãéåžžã«é«ãã§ãã4è¡ã®ãœãŒã¹ã³ãŒãã¯15åã«ãªããŸããïŒããã¯ãäžè¬çãªå žåçãªPythonã³ãŒããç¹ã«asycioãè³è³ããçç±ã§ã¯ãããŸããããå°ãªããšãããªãŒãããã³ããã°ã©ãã³ã°ã«å¯Ÿãããéåžžã®ãã¯ãããžãŒãã®å©ç¹ã®èšŒæ ã§ã¯ãããŸãããïŒ
ãªã¹ã3.Pythonã®ãªãŒãããã³ã¹ãã€ããŒã®ã³ãŒã
# "" "Blog"
class PBSpider:
def __init__(self, name):
self.nState = 0; self.bIfLoop = True; self.site_name = name; self.page = 1;
self.p_mainFSM = b_sleep;
def x1(self): return self.page < 4
def y1(self):
self.bIfLoop = False; automaton.append(b_sleep);
b_sleep.p_mainFSM = blog
automaton[-1].bIfLoop = True;
automaton[-1].nState = 0
def y2(self): print(self.site_name, self.page)
def y3(self): self.page += 1
def y4(self): self.page = 1
def loop(self):
if (self.x1() and self.nState == 0): self.y1(); self.nState = 1
elif (not self.x1() and self.nState == 0): self.y1(); self.y4(); self.nState = 33
elif (self.nState == 1): self.y2(); self.y3(); self.nState = 0
# "" "News"
class PNSpider:
def __init__(self, name):
self.nState = 0; self.bIfLoop = True; self.site_name = name; self.page = 1;
self.p_mainFSM = n_sleep;
def x1(self): return self.page < 4
def y1(self):
self.bIfLoop = False; automaton.append(n_sleep);
n_sleep.p_mainFSM = news
automaton[-1].bIfLoop = True;
automaton[-1].nState = 0
def y2(self): print(self.site_name, self.page)
def y3(self): self.page += 1
def y4(self): self.page = 1
def loop(self):
if (self.x1() and self.nState == 0): self.y1(); self.nState = 1
elif (not self.x1() and self.nState == 0): self.y1(); self.y4(); self.nState = 33
elif (self.nState == 1): self.y2(); self.y3(); self.nState = 0
# "Forum"
class PFSpider:
def __init__(self, name):
self.nState = 0; self.bIfLoop = True; self.site_name = name; self.page = 1;
self.p_mainFSM = f_sleep;
def x1(self): return self.page < 4
def y1(self):
self.bIfLoop = False; automaton.append(f_sleep);
f_sleep.p_mainFSM = forum
automaton[-1].bIfLoop = True;
automaton[-1].nState = 0
def y2(self): print(self.site_name, self.page)
def y3(self): self.page += 1
def y4(self): self.page = 1
def loop(self):
if (self.x1() and self.nState == 0): self.y1(); self.nState = 1
elif (not self.x1() and self.nState == 0): self.y1(); self.y4(); self.nState = 33
elif (self.nState == 1): self.y2(); self.y3(); self.nState = 0
#
b_sleep = PSleep(1, 0)
n_sleep = PSleep(1, 0)
f_sleep = PSleep(1, 0)
# ""
blog = PBSpider("Blog")
news = PNSpider("News")
forum = PFSpider("Forum")
#
automaton = []
automaton.append(blog);
automaton.append(news);
automaton.append(forum);
start = time.time()
# ( event_loop)
while True:
ind = 0;
while True:
while ind < len(automaton):
if automaton[ind].nState == 4:
automaton[ind].p_mainFSM.bIfLoop = True
automaton.pop(ind)
ind -=1
elif automaton[ind].bIfLoop:
automaton[ind].loop()
elif automaton[ind].nState == 33:
print("{:.2F}".format(time.time() - start))
exit()
ind += 1
ind = 0
èªåãã©ã€ãã®çµæã¯æ¬¡ã®ãšããã§ãã
ãã¥ãŒã¹1
ãã©ãŒã©ã 1
ããã°1
ããã°2
ãã¥ãŒã¹2
ãã©ãŒã©ã 2
ãã¥ãŒã¹3
ãã©ãŒã©ã 3
ããã°
33.00
ãããã話ãåããŸããããã³ãŒããµã€ãºã®å¢å ã¯ãPythonã®ãã€ã³ã¿ã®åé¡ãåå ã§ããããã®çµæãããŒãžããšã«ã¯ã©ã¹ãäœæããå¿ èŠããããã³ãŒãã3åã«ãªããŸããããããã£ãŠãçŽ15ã§ã¯ãªããçŽ5åã®é³éã§è©±ãæ¹ãæ£ããã§ããããã°ã©ãã³ã°ã«ãããããçç·ŽãããPythonãã€ããããã¯ããã®æ¬ ç¹ãåãé€ãããšããã§ãããããããŸããã
ããããäž»ãªçç±ã¯ãŸã ãã€ã³ã¿ãŒã§ã¯ãããŸããã以äžã«ç€ºãC ++ã³ãŒãã¯ããã€ã³ã¿ãŒãå®å šã«èªç±ã«æäœã§ãããããã¯ã©ã¹ããšã«ããã«å€ãã®è¡ããããŸãããã®çç±ã¯ã䜿çšãããŠããèšç®ã¢ãã«ããã®èšè¿°ã®èšèªãããã³ããã«åºã¥ãã¢ã«ãŽãªãºã ã®å®è£ ãžã®ã¢ãããŒãã§ããå³ïŒå³ïŒã¯ããããã¯å³åœ¢åŒã®åŸæ¥ã®ã¹ãã€ããŒå¹³é¢ã¢ãã«ããã³ãªãŒãããã³ã¢ãã«ã瀺ããŠãããåçã®å€æãå¯èœã§ãããå€èŠäžããã³å質äžããããã¯ç°ãªãã¢ãã«ã§ããããšãããããŸãã Automataã«ã¯ç¶æ ããããŸããããããã¯å³ã«ã¯ãããã®çè·¡ãããããŸããã Automataã¯ãå®çŸ©äžã颿£æéã§åäœãããããã¯å³ã¯ããã倢èŠããããŸãããããã¯ãã¹ãŠãã¢ãã«ã®å®è£ ã«ç¹å®ã®çŸ©åã課ããŸãã
颿£æéã®æŠå¿µããªãããšã¯ãæ¢åã®ãããã¯å³ããã°ã©ãã³ã°ã¢ãã«ã®åé¡ã®æ¬è³ªã§ãããå³å¯ã«èšãã°ãããã«å¯ŸããŠå®çŸäžå¯èœãªããšãå®çŸããå¿ èŠããããŸãã䞊åããã»ã¹ããªãŒãããã³ã®å Žåã䞊åããã»ã¹ïŒããã³éåæïŒã®ã¢ãã«ãšããŠã®ãªãŒãããã³ãããã¯ãŒã¯ãèªç¶ãªç¶æ ã§ããããšãæãåºããŠãã ããã
å³ïŒ1.ã¹ãã€ããŒãã¬ãŒã³ã®èªåã¢ãã«ãšãããã¯å³ã¢ãã«
ãã ããå¥ã®ããã»ã¹ã®ã¬ãã«ã§ããã¢ãã«ã«ã¯ãã¢ãã«ã®èšèªãšå®è£ ã«æåœ±ãããéãããããŸãããããã®å質ã®ãããã§ãäžè²«æ§ã®ãããããã¯å³ã®è¬çœªè ã¯ãæç€ºçãŸãã¯æé»çã«ããããéåžžã«ã³ã³ãã¯ãã«èšè¿°ããããšãå¯èœã«ããèšèªæ§é ãäœæããŸãããåãforã«ãŒãããŸãã¯å°ãªããšãæé»çã«æé»çã«å®è¡ãããæŒç®åã®ã·ãŒã±ã³ã¹ïŒã¢ã¯ã·ã§ã³y1ãy2ãy3ïŒã䜿çšããŸãã
ãããŒãã£ãŒãã®å Žåãåé¡ãªã1ã€ã®ããã¯ã¹ã«ã¢ã¯ã·ã§ã³ããªã¹ãã§ããŸããããã«ãããã¢ã¯ã·ã§ã³ã®é 次çãªæ§è³ªãå€ããããšã¯ãããŸããããªãŒãããã³ãç¶æ s2ãs3ã®é·ç§»ãç¶æ s1ã®ãµã€ã¯ã«ã«çœ®ãæããã¢ãŒã¯ãåãã¢ã¯ã·ã§ã³ã§ããŒã¯ãããšãã¢ã«ãŽãªãºã ã®æå³ãå€ãããŸãããã®äœæ¥ã«äžŠååŠçãå°å ¥ããŸããäžèšã®ã¢ã¯ã·ã§ã³ã¯å³å¯ã«é çªã«å®è¡ããå¿ èŠããããããããã«ãããªãŒãããã³ã¢ãã«ã®å€èгãäºåã«æ±ºå®ãããŸãïŒå³1ãåç §ïŒãæéãªãŒãããã³ã¯ããäºéæèããèš±å¯ããªãã¢ãã«ã§ãã
ãããã¯å³ã«é¢æ£æéããªãããšã圌ãã®å©ç¹ã§ããããããä»ãããã¯åœŒãã®äž»ãªæ¬ ç¹ã«ãªã£ãŠããŸããããã¯åæ¶çã§ã¯ãªãããã«èŠãããããããªãã®ã§ãããã¯åœ±é¿ãåãŒããŸãããããŠèãæ¹ãã·ãŒã±ã³ã·ã£ã«èšèªã¯ãããã°ã©ããŒã«ä»ã®äœããåŠå®ããããšã«ãã£ãŠãããã°ã©ããŒã®ã·ãŒã±ã³ã·ã£ã«ãªèãæ¹ãæ£åœåããŸã-䞊åãããã¯ãæ¢åã®éåæããã°ã©ãã³ã°ã®æ§ç¯ãæ£åœåããåãasyncioããã±ãŒãžã®ãªãã¬ãŒã¿ãŒã®ã»ãããšæ©èœãæç€ºãããã®ã§ãããããŠãã·ãŒã±ã³ã·ã£ã«ããã°ã©ã ã«ç²ŸéããŠããããã°ã©ããŒãéåæïŒã»ãŒäžŠåïŒã«å€æã§ããã®ã¯ããŸãã«ãã®ã¢ãããŒãã§ãããšäž»åŒµãããŠããŸãã
ããããèšäºãšãã®ç»åã®ãããã¯ã«æ»ããŸããç§ãã¡ã¯ãé£è¡æ©ããæ¬²ããã£ãã®ã§ããããããæã«å ¥ããŸããïŒãã©ã€ããããæ£ç¢ºã«ã¯ãç®ã«èŠããçµæã¯ãå€èгã¯å€å°ç°ãªããŸãããæ¬è³ªçã«å®å šã«åºå¥ã§ããŸããããããã¯ããã©ã°ãéžæããããããã³ã«ã«ç°ãªãé åºã§èšé²ãããããã«è§£éã§ããŸããããé£è¡æ©ãèªäœã¯æ¬ââæ¥ã®ããã«é£è¡ããŸãããåæã«ãããŠåæã«åœŒãã®æãæšãŠãããããŠãããããã©ã®ãããªé åºã§èšé²ãããã-圌ããèšãããã«ãã±ãŒã¹ã¯10çªç®ã§ããäž»ãªãã®ã¯å®çŸãããå®è¡ãããŸãïŒãããã®ãªãªãŒã¹ã®é åºãšæéã¯ãã©ã€ãããã°ã©ã ã«å¯Ÿå¿ããŸã
ã³ãŒããçãããããšãã§ããŸãããããã£ãŠãæããã«ã1ã€ã®ã¯ã©ã¹ã®ã³ãŒãã®ã¿ã«å¶éããããšãã§ããŸããã€ãã³ãã«ãŒãã³ãŒããé衚瀺ã«ããããšãã§ããŸããåæã«ããœãŒã¹ã³ãŒãã§ãéåæã®èåŸã«é ãããŠãããšã³ãžã³ã³ã³ããŒãã¡ã³ãã³ãŒããéããŠãªãã¬ãŒã¿ãŒãåŸ ã€å ŽåããªãŒãããã³ã³ãŒãã®ããªã¥ãŒã ã¯ããã»ã©æããªãã§ãããã
3.Pythonã§ãªãŒãããã³ãå®è£ ããéã®åé¡ã«ã€ããŠ
èªåã³ãŒãã®åºçŸãåŒãèµ·ãããåé¡ã«ã€ããŠããã«è©³ããèŠãŠãããŸããããããã«é ãæåŸã®ãã®ã¯ããœãŒã¹ã³ãŒããšæ¯èŒããŠãããŸã§ã®ãšãã巚倧ã«èŠããŸããããããMozhaiskyã®æåã®èªç©ºæ©ã¯ãçŸä»£ã®ã也ç¥ããšã¯ã»ã©é ããã®ã§ãããæåã®è»ã¯ãçŸä»£ã®ã©ã®èªç©ºæ©ãšãããã»ã©å€ãããªãã£ãããšã«æ³šæããŠãã ãããæç€ºããããªãŒãããã³ã³ãŒãã®åé¡ã¯ãPythonèšèªã®çŸåšã®çè§£ã«å€§ããé¢ä¿ããŠããããããããèšèªèªäœã®æ©èœã«ã¯ããã»ã©é¢ä¿ããªãããšã匷調ããŠãããŸãã
ããã«ãããããããæåã®åé¡ã¯ããªãŒãããã³ã¢ãã«ã®èšè¿°èšèªã«é¢é£ããŠããŸãã C ++ã§ã¯ãèšèªã«ãã£ãŠè§£æ±ºãããŸãã Pythonã§ã¯ãã®ãããªå¯èœæ§ã¯èŠåœãããŸãããæ®å¿µãªããã圌ãã仿ã èšãããã«ããŸã£ããèšèããããã®ãããif-elif-elseèšèªã®å¶åŸ¡æŒç®åã«åºã¥ããŠãªãŒãããã³ãå®è£ ããæ¹æ³ãåºæ¬ãšããŸãããããã«ãCPSUïŒaïŒã§ã¯ããªãŒãããã³èªäœã«å ããŠã䞊ååŠçãå®å šã«å®è£ ããããã«ã·ã£ããŠã¡ã¢ãªãšãªãŒãããã³ã¹ããŒã¹ãå°å ¥ãããããšãæãåºããŸããããããªããšããªãŒãããã³ããã°ã©ãã³ã°ã®å¯èœæ§ã¯éåžžã«éãããŠãããå€ãã®ç¹ã§å£ã£ãŠããŸãã
ãã§ã«è¿°ã¹ã次ã®åé¡ã¯ãã€ã³ã¿ãŒã§ãã C ++ã§ã¯åé¡ãããŸããã CPSUïŒaïŒã®ãã¬ãŒã ã¯ãŒã¯å ã§ãOOPãã©ãã€ã ã«åŸã£ãŠãåºæ¬çãªãªãŒãããã³ã¯ã©ã¹ãäœæãããããããé©çšããããªãŒãããã³ã¯ã©ã¹ãçæããããããã®ãã©ã¡ãŒã¿ãŒã¯ãã€ã³ã¿ãŒã ãã§ãªãã¢ãã¬ã¹ã«ããªããŸããããããã¹ãŠã«ãããå€ãã®äžŠåçžäºäœçšããã»ã¹ãå«ãã¿ã¹ã¯ãç°¡åãã³ã³ãã¯ããéåžžã«å¹ççã«èšè¿°ããã³å®è£ ã§ããŸãã
以äžã¯ãæ€èšããäŸã«çžåœããC ++ãªãŒãããã³ã¯ã©ã¹ã®ã³ãŒãã§ãããªã¹ã4ã®é å»¶ã³ãŒãã¯ããªã¹ã1ã®await asyncio.sleepïŒ1ïŒã®è¡ãšåçã§ããã°ã©ã圢åŒã§ã¯ãå³1ã®FAwaitSleepãªãŒãããã³ã¢ãã«ã«å¯Ÿå¿ããŸãã1.ãã®ãããªããããŠãã®ãããªãªãŒãããã³ã ããéåæãšèŠãªãããšãã§ããèšç®ãããŒãé ãããããšã¯ãããŸãããåãå³ã®FSleepã¯ãéåžžã®sleepïŒïŒæŒç®åã«å¯Ÿå¿ããŸããããç°¡åã§ãããy1ã®äœçšã«ããéåžžã®é 次é å»¶ãçºçããããã颿£æéã¢ãã«ãç Žå£ãããããšãä¿èšŒãããŠããŸãããããŠãããã¯ãã¯ãäœã®åœ¹ã«ãç«ããªãã
ãªã¹ã4.éåæé
å»¶ã³ãŒã
// ( )
#include "lfsaappl.h"
#include <QTime>
class FAwaitSleep :
public LFsaAppl
{
public:
FAwaitSleep(int n);
protected:
int x1();
QTime time;
int nAwaitSleep;
};
#include "stdafx.h"
#include "FAwaitSleep.h"
static LArc TBL_AwaitSleep[] = {
LArc("s1", "s1","x1", "--"), //
LArc("s1", "00","^x1", "--"), //
LArc()
};
FAwaitSleep::FAwaitSleep(int n):
LFsaAppl(TBL_AwaitSleep, "FAwaitSleep")
{
nAwaitSleep = n; time.start();
}
int FAwaitSleep::x1() { return time.elapsed() < nAwaitSleep; }
ã¹ãã€ããŒãã¬ãŒã³ã®C ++ã³ãŒãããªã¹ã5ã«ç€ºããŸãããã®ã³ãŒãã¯ãPythonã³ãŒãã®ãããã¯å³ãããããã®ã¢ãã«ã«ã¯ããã«é©ããŠããŸããç¹ã«ããªãŒãããã³ã®é·ç§»ããŒãã«ãšãªãŒãããã³ã°ã©ãã®å€èŠ³ãæ¯èŒãããšããããã¯ãåãæœè±¡çãªæŠå¿µãã€ãŸããªãŒãããã³ãèšè¿°ããããã®åçŽã«ç°ãªã圢åŒã§ãããŸããé å»¶ãäœæãããšãã«èŠªã¯ã©ã¹ãžã®ãã€ã³ã¿ãã©ã®ããã«æž¡ããããã瀺ããŸãïŒã¢ã¯ãã£ããã£y1ã®FCallã¡ãœããã®åŒã³åºããåç §ïŒã
ãªã¹ã5.ãµã€ãããŒãžã®èªã¿åããã·ãã¥ã¬ãŒãããã¹ãã€ããŒãã¬ãŒã³ã®ã³ãŒã
// "".
#include "lfsaappl.h"
class FAwaitSleep;
class FSpider :
public LFsaAppl
{
public:
LFsaAppl* Create(CVarFSA *pCVF) { Q_UNUSED(pCVF)return new FSpider(nameFsa); }
bool FCreationOfLinksForVariables() override;
FSpider(string strNam);
virtual ~FSpider(void);
CVar *pVarStrSiteName; //
FAwaitSleep *pFAwaitSleep{nullptr};
protected:
int x1(); void y1(); void y2(); void y3(); void y4();
int page{1};
};
#include "stdafx.h"
#include "FSpider.h"
#include "FSleep.h"
#include "FAwaitSleep.h"
#include <QDebug>
static LArc TBL_Spider[] = {
LArc("st","s1","--","--"),
LArc("s1","s2","x1","y1"), // x1- <. ; y1-;
LArc("s2","s3","--","y2"), // y2- ;
LArc("s3","s1","--","y3"), // y3-
LArc("s1","st","^x1","y4"), // y4-
LArc()
};
FSpider::FSpider(string strNam):
LFsaAppl(TBL_Spider, strNam)
{ }
FSpider::~FSpider(void) { if (pFAwaitSleep) delete pFAwaitSleep; }
bool FSpider::FCreationOfLinksForVariables() {
pVarStrSiteName = CreateLocVar("strSiteName", CLocVar::vtString, "name of site");
return true;
}
// ?
int FSpider::x1() { return page < 4; }
// create delay - pure sleep (synchronous function) or await sleep (asynchronous function)
void FSpider::y1() {
//sleep(1000);
// await sleep (asynchronous function)
if (pFAwaitSleep) delete pFAwaitSleep;
pFAwaitSleep = new FAwaitSleep(1000);
pFAwaitSleep->FCall(this);
}
void FSpider::y2() {
#ifdef QT_DEBUG
string str = pVarStrSiteName->strGetDataSrc();
printf("%s%d", str.c_str(), page);
qDebug()<<str.c_str()<<page;
#endif
}
void FSpider::y3() { page++; }
void FSpider::y4() { page = 1; }
ããããã€ãã³ãã«ãŒãã®æ©èœãå®è£ ããã³ãŒãã¯ãããŸãããåã«ããã®å¿ èŠã¯ãããŸããããã®æ©èœã¯ãCPSUïŒaïŒç°å¢ã®ã³ã¢ã«ãã£ãŠå®è¡ãããŸãããªããžã§ã¯ããäœæãããããã®äžŠåå®è¡ãåå¥ã®æéã§ç®¡çããŸãã
4.çµè«
ç°¡æœãã¯å¿ ãããæèœã®å§åйã§ãããšã¯éãããæã«ã¯ããã¯èã®çµã³ã€ãã®å åã§ããããŸãã確ãã«ãäžåºŠã«åºå¥ããããšã¯å°é£ã§ããå€ãã®å ŽåãPythonã³ãŒãã¯C ++ã³ãŒããããçããªããŸããããããããã¯åçŽãªã±ãŒã¹ã§ã¯äžè¬çã§ãããœãªã¥ãŒã·ã§ã³ãè€éã«ãªãã»ã©ããã®éãã¯å°ãªããªããŸããçµå±ããœãªã¥ãŒã·ã§ã³ã®è€éãã§ãããã¢ãã«ã®æ©èœã«ãã£ãŠæ±ºå®ãããŸãããªãŒãããã³ã¢ãã«ã¯ããããã¯å³ãããã¯ããã«åŒ·åã§ãã
èªååãšäžŠååã¯ããŸã第äžã«ãè€éãã®åé¡ã解決ãããããšæŠãããã®éåžžã«å¹æçãªææ®µã§ãããããã°ã©ã ã®é床ãäžããææ®µã§ã¯ãããŸãããããã¯ãã¹ãŠãªãŒãããã³ã¢ãã«ã§ããããã䞊ååŠçãPythonã§å®è£ ããã®ã¯å°é£ã§ãããã®ãããããããããããªãŒãªã©ãã¹ãŠã«ããããããããã®æ¹åã«ç§ã説åŸããã®ã¯å°é£ã§ããç§ã¯C ++ç°å¢ã«ãã£ãšæ³šæãæããåãã³ããã³ãããã«å°å ¥ããããšã¯ããŸãæ£åœåãããŸããããã®ã¢ãã«ã¯äžæçãªãã®ã§ããããã®å®è£ ã®çç±ã¯å€§éšåã匷å¶ãããŠããŸãããããŠã䞊åã¢ãã«ãéžæããåé¡ã解決ããããããã®ãã¯ã©ããããã©ãããŸããïŒ
ãããã£ãŠãç³ãèš³ãããŸããããç§ã®å¥œã¿ã¯ãŸã C ++åŽã§ãããããŠãããªããç§ã®å°éçãªèå³ã®ããåéããããããäžæ°å³ãªãããŒããªã¢ã«ã¿ã€ã ã®ç£æ¥ã·ã¹ãã ãèãããšãç§ã¯ãã®ããã«éžæããããšã¯ã§ããŸãããã¯ããããçš®ã®ç°å¢ãããçš®ã®ãµãŒãã¹ã¯Pythonã䜿çšããŠäœæã§ããŸãã䟿å©ãé«éããããã¿ã€ãããããããããŸããçãããããœãªã¥ãŒã·ã§ã³ã®äžæ žã§ãã䞊åã¢ãã«ãããã»ã¹èªäœã®ããžãã¯ã¯ãæç¢ºã«C ++ã§ãããæç¢ºã«èªååãããŠããŸãããã¡ãããããã§ã¯ãªãŒãããã³ãããéèŠã§ãããæ¯é çã§ããããããcoroutinesã§ã¯ãããŸãã:)
ããã«...ãã±ããã¢ãã«ã®å®è£ ã«æ³šæãæããªããããããª[2]ãã芧ãã ããã圌女ã«ã€ããŠã12åé ãããããªãèªããŸããæ©æ¢°ã䜿çšããããã®è¬åž«ãžã®æ¬æ:)ãããŠçã埡銳走ã®ããã«ã[3]ããã®å¥ã®è§£æ±ºç..ãããã¯éåæããã°ã©ãã³ã°ãšéåæã®ç²Ÿç¥ã«åºã¥ããŠããŸããå®éããã¹ãŠã¯ãã®äŸãã€ãŸãPythonã§ã®ãã¹ãããããªãŒãããã³ã®å®è£ ããå§ãŸããŸãããããã§ã¯ãå ¥ãåã®æ·±ãã¯äžèšã®äŸãããããã«å€§ãããªã£ãŠããŸãããªã¹ã6ã¯ããœãŒã¹ã³ãŒããšããã«å¯Ÿå¿ãããªãŒãããã³Pythonã瀺ããŠããŸããå³ã§ã¯ 2ã¯èªåè¶é£²çšã¢ãã«ã§ããããªã¹ã7ã¯VKPïŒaïŒã®åçã®C ++å®è£ ã瀺ããŠããŸããæ¯èŒãåæãçµè«ã®åŒãåºããæ¹å€...
ãªã¹ã6.Pythonã§éåæçã«ãè¶ãèªãã ã飲ãã ããã
import asyncio
import time
# # Easy Python. Asyncio python 3.7 https://www.youtube.com/watch?v=PaY-hiuE5iE
# # 10:10
# async def teatime():
# await asyncio.sleep(1)
# print('take a cap of tea')
# await asyncio.sleep(1)
#
# async def read():
# print('Reading for 1 hour...')
# await teatime()
# print('...reading for 1 hour...')
#
# if __name__ == '__main__':
# asyncio.run(read())
class PSleep:
def __init__(self, t, p_FSM): self.SetTime = t; self.nState = 0; self.bIfLoop = False; self.p_mainFSM = p_FSM
def x1(self): return time.time() - self.t0 <= self.SetTime
def y1(self): self.t0 = time.time()
def loop(self):
if (self.nState == 0): self.y1(); self.nState = 1
elif (self.nState == 1):
if (not self.x1()): self.nState = 4
class PTeaTime:
def __init__(self, p_FSM): self.nState = 0; self.bIfLoop = False; self.p_mainFSM = p_FSM;
def y1(self): self.bIfLoop = False; automaton.append(sl); automaton[-1].bIfLoop = True; automaton[-1].nState = 0
def y2(self): print('take a cap of tea')
def loop(self):
if (self.nState == 0): self.y1(); self.nState = 1
elif (self.nState == 1): self.y2(); self.nState = 2
elif (self.nState == 2): self.y1(); self.nState = 3
elif (self.nState == 3): self.nState = 4
class PRead:
def __init__(self): self.nState = 0; self.bIfLoop = False;
def y1(self): print('Reading for 1 hour...')
def y2(self): self.bIfLoop = False; automaton.append(rt); automaton[-1].bIfLoop = True; automaton[-1].nState = 0
def loop(self):
if (self.nState == 0): self.y1(); self.nState = 1
elif (self.nState == 1): self.y2(); self.nState = 2
elif (self.nState == 2): self.y1(); self.nState = 33; self.bIfLoop = False
read = PRead()
rt = PTeaTime(read)
sl = PSleep(5, rt)
automaton = []
automaton.append(read); automaton[-1].bIfLoop = True
while True:
ind = 0;
while True:
while ind < len(automaton):
if automaton[ind].nState == 4:
automaton[ind].p_mainFSM.bIfLoop = True
automaton.pop(ind)
ind -=1
elif automaton[ind].bIfLoop:
automaton[ind].loop()
elif automaton[ind].nState == 33:
exit()
ind += 1
ind = 0
å³ïŒ2.ãè¶ã飲ãèªåã¢ãã«
ãªã¹ã7.C ++ã§éåæçã«ãè¶ãèªãã ã飲ãã ããã
#include "lfsaappl.h"
class FRead :
public LFsaAppl
{
public:
LFsaAppl* Create(CVarFSA *pCVF) { Q_UNUSED(pCVF)return new FRead(nameFsa); }
FRead(string strNam);
virtual ~FRead(void);
protected:
void y1(); void y2(); void y3();
LFsaAppl *pFRealTime{nullptr};
};
#include "stdafx.h"
#include "FRead.h"
#include "FTeaTime.h"
#include <QDebug>
static LArc TBL_Read[] = {
LArc("s1","s2","--","y1"), // Reading for 1 hour...
LArc("s2","s3","--","y2"), // Call(TeaTime)
LArc("s3","s4","--","y1"), // Reading for 1 hour...
LArc("s4","s5","--","y3"), // sleep(5)
LArc("s5","s1","--","--"), //
LArc()
};
FRead::FRead(string strNam):
LFsaAppl(TBL_Read, strNam)
{ }
FRead::~FRead(void) { if (pFRealTime) delete pFRealTime; }
void FRead::y1() {
#ifdef QT_DEBUG
qDebug()<<"Reading for 1 hour...";
#endif
}
void FRead::y2() {
if (pFRealTime) delete pFRealTime;
pFRealTime = new FTeaTime("TeaTime");
pFRealTime->FCall(this);
}
void FRead::y3() { FCreateDelay(5000); }
#include "lfsaappl.h"
class FTeaTime :
public LFsaAppl
{
public:
FTeaTime(string strNam);
protected:
void y1(); void y2();
};
#include "stdafx.h"
#include "FTeaTime.h"
#include <QDebug>
#include "./LSYSLIB/FDelay.h"
static LArc TBL_TeaTime[] = {
LArc("s1", "s2","--","y1"),// sleep(1)
LArc("s2", "s3","--","y2"),// take a cap of tea
LArc("s3", "s4","--","y1"),// sleep(1)
LArc("s4", "00","--","--"),//
LArc()
};
FTeaTime::FTeaTime(string strNam):
LFsaAppl(TBL_TeaTime, strNam)
{ }
void FTeaTime::y1() { FCreateDelay(2000); }
void FTeaTime::y2() {
#ifdef QT_DEBUG
qDebug()<<"take a cap of tea";
#endif
}
PS
ãã§ã«èšäºãæžããåŸãYerain Diaz [4]ã«ããèšäºã®ç¿»èš³ãèªãã åŸãç§ã¯å¥ã®ããªãè峿·±ãããããç§°è³ã«å€ãããäžè¬çãªã³ããã³ãç¹ã«éåæã®èŠæ¹ã«ç²ŸéããŸããããã®äºå®ãä»ã®äººãããã奜ãã«ãããããããç§ãã¡ã¯ãŸã ãåå¯Ÿã®æ¹åã«é²ããã§ããã:)ç§ã¯Rob PikeãšããäžŠè¡æ§ã¯äžŠåæ§ã§ã¯ãªãããšãã1ã€ã®ããšã«åæããŸããç«¶äºåã¯ãããå³ãããšããèšãããããããŸãããã䞊ååŠçãšã¯ãŸã£ããé¢ä¿ããããŸããããããŠãGoogleTranslateããã®ãã¬ãŒãºãã䞊ååŠçã¯äžŠååŠçã§ã¯ãªãããšç¿»èš³ããŠããããšã¯æ³šç®ã«å€ããŸããã°ãŒã°ã«ãšããç·ã¯ç¢ºãã«ééã£ãŠããŸãããããã誰ãã圌ã«ãããçŽåŸãããŸãããïŒ:)
æç®
- Shultais Education. 1. . [ ], : www.youtube.com/watch?v=BmOjeVM0w1U&list=PLJcqk6mrJtxCo_KqHV2rM2_a3Z8qoE5Gk, . . . ( 01.08.2020).
- Computer Science Center. 9. async / await ( Python). [ ], : www.youtube.com/watch?v=x6JZmBK2I8Y, . . . ( 13.07.2020).
- Easy Python. Asyncio python 3.7. [ ], : www.youtube.com/watch?v=PaY-hiuE5iE, . . . ( 01.08.2020).
- ã€ã§ã¬ã€ãã£ã¢ã¹ãç·Žç¿äžã®pythonéçºè ã®ããã®Asyncioã[é»åãªãœãŒã¹]ãã¢ã¯ã»ã¹ã¢ãŒãïŒwww.youtube.com/watchïŒv = PaY-hiuE5iEãç¡æãèšèªããã·ã¢ ïŒæ²»çæ¥2020幎8æ1æ¥ïŒã