{"id":74840,"date":"2024-08-27T01:11:52","date_gmt":"2024-08-26T21:41:52","guid":{"rendered":"https:\/\/nabfollower.com\/blog\/processing-dags-with-async-python-and-graphlib-2c0g\/"},"modified":"2024-08-27T01:11:52","modified_gmt":"2024-08-26T21:41:52","slug":"processing-dags-with-async-python-and-graphlib-2c0g","status":"publish","type":"post","link":"https:\/\/nabfollower.com\/blog\/processing-dags-with-async-python-and-graphlib-2c0g\/","title":{"rendered":"\u067e\u0631\u062f\u0627\u0632\u0634 DAG \u0647\u0627 \u0628\u0627 \u067e\u0627\u06cc\u062a\u0648\u0646 \u0646\u0627\u0647\u0645\u06af\u0627\u0645 \u0648 graphlib"},"content":{"rendered":"<p>Summarize this content to 400 words in Persian Lang \u0627\u062e\u06cc\u0631\u0627\u064b \u0628\u0627 \u06cc\u06a9 \u0645\u0627\u0698\u0648\u0644 \u062c\u0627\u0644\u0628 \u062f\u0631 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0627\u0633\u062a\u0627\u0646\u062f\u0627\u0631\u062f \u0628\u06cc \u0627\u0646\u062a\u0647\u0627 \u067e\u0627\u06cc\u062a\u0648\u0646 \u0645\u0648\u0627\u062c\u0647 \u0634\u062f\u0645: graphlib. \u0627\u06af\u0631 \u0642\u0628\u0644\u0627\u064b \u0628\u0627 \u0622\u0646 \u06a9\u0627\u0631 \u0646\u06a9\u0631\u062f\u0647 \u0627\u06cc\u062f\u060c \u0627\u06cc\u0646 \u06cc\u06a9 \u0627\u0628\u0632\u0627\u0631 \u06a9\u0648\u0686\u06a9 \u0627\u0633\u062a \u06a9\u0647 \u062f\u0631 Python 3.9 \u0627\u0636\u0627\u0641\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a \u0648 \u0641\u0642\u0637 \u06cc\u06a9 \u06a9\u0644\u0627\u0633 \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0645\u06cc \u06a9\u0646\u062f: TopologicalSorter.<\/p>\n<p>\u0646\u0627\u0645 \u062e\u0648\u062f \u062a\u0648\u0636\u06cc\u062d\u06cc \u0627\u0633\u062a &#8212; \u0627\u06cc\u0646 \u06cc\u06a9 \u06a9\u0644\u0627\u0633 \u0628\u0631\u0627\u06cc \u0645\u0631\u062a\u0628 \u0633\u0627\u0632\u06cc \u062a\u0648\u067e\u0648\u0644\u0648\u0698\u06cc\u06a9\u06cc \u06cc\u06a9 \u0646\u0645\u0648\u062f\u0627\u0631 \u0627\u0633\u062a. \u0627\u0645\u0627 \u0645\u0646 \u0641\u06a9\u0631 \u0646\u0645\u06cc\u200c\u06a9\u0646\u0645 \u06a9\u0647 \u062f\u0631 \u0627\u0628\u062a\u062f\u0627 \u0641\u0642\u0637 \u0628\u0627 \u0645\u0631\u062a\u0628\u200c\u0633\u0627\u0632\u06cc \u0646\u0648\u0634\u062a\u0647 \u0634\u062f\u0647 \u0628\u0627\u0634\u062f\u060c \u0632\u06cc\u0631\u0627 API \u0646\u0633\u0628\u062a\u0627\u064b \u0645\u0631\u0645\u0648\u0632\u060c \u0627\u0645\u0627 \u0641\u0648\u0642\u200c\u0627\u0644\u0639\u0627\u062f\u0647 \u0645\u0641\u06cc\u062f\u06cc \u062f\u0627\u0631\u062f\u060c \u0645\u0627\u0646\u0646\u062f prepare() \u0631\u0648\u0634 \u06cc\u0627 is_active(). \u0627\u06cc\u0646 \u0645\u062b\u0627\u0644 \u062f\u0631 \u0645\u0633\u062a\u0646\u062f\u0627\u062a \u0628\u0647 \u0627\u0646\u06af\u06cc\u0632\u0647 \u067e\u0634\u062a \u0622\u0646 \u0627\u0634\u0627\u0631\u0647 \u0645\u06cc \u06a9\u0646\u062f:<\/p>\n<p>topological_sorter = TopologicalSorter()<\/p>\n<p># Add nodes to &#8216;topological_sorter&#8217;&#8230;<\/p>\n<p>topological_sorter.prepare()<br \/>\nwhile topological_sorter.is_active():<br \/>\n    for node in topological_sorter.get_ready():<br \/>\n        # Worker threads or processes take nodes to work on off the<br \/>\n        # &#8216;task_queue&#8217; queue.<br \/>\n        task_queue.put(node)<\/p>\n<p>    # When the work for a node is done, workers put the node in<br \/>\n    # &#8216;finalized_tasks_queue&#8217; so we can get more nodes to work on.<br \/>\n    # The definition of &#8216;is_active()&#8217; guarantees that, at this point, at<br \/>\n    # least one node has been placed on &#8216;task_queue&#8217; that hasn&#8217;t yet<br \/>\n    # been passed to &#8216;done()&#8217;, so this blocking &#8216;get()&#8217; must (eventually)<br \/>\n    # succeed.  After calling &#8216;done()&#8217;, we loop back to call &#8216;get_ready()&#8217;<br \/>\n    # again, so put newly freed nodes on &#8216;task_queue&#8217; as soon as<br \/>\n    # logically possible.<br \/>\n    node = finalized_tasks_queue.get()<br \/>\n    topological_sorter.done(node)<\/p>\n<p>\u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 graphlib \u06cc\u06a9 \u0645\u0627\u0698\u0648\u0644 \u0641\u0642\u0637 \u0628\u0631\u0627\u06cc \u0645\u0631\u062a\u0628\u200c\u0633\u0627\u0632\u06cc \u0646\u0645\u0648\u062f\u0627\u0631\u0647\u0627 \u0646\u06cc\u0633\u062a\u060c \u0628\u0644\u06a9\u0647 \u0627\u0628\u0632\u0627\u0631\u06cc \u0628\u0631\u0627\u06cc \u0627\u062c\u0631\u0627\u06cc \u0646\u0645\u0648\u062f\u0627\u0631\u0647\u0627\u06cc \u0648\u0638\u0627\u06cc\u0641 \u0628\u0647 \u062a\u0631\u062a\u06cc\u0628 \u062a\u0648\u067e\u0648\u0644\u0648\u0698\u06cc\u06a9\u06cc \u0627\u0633\u062a\u060c \u06a9\u0647 \u062f\u0631 \u0635\u0648\u0631\u062a\u06cc \u0645\u0641\u06cc\u062f \u0627\u0633\u062a \u06a9\u0647 \u062d\u062c\u0645 \u06a9\u0627\u0631\u06cc \u0634\u0645\u0627 \u0628\u0633\u062a\u0647 \u0628\u0647 \u0646\u062a\u0627\u06cc\u062c \u06a9\u0627\u0631\u0647\u0627\u06cc \u062f\u06cc\u06af\u0631 \u0648\u0638\u0627\u06cc\u0641\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u062f. \u0646\u0645\u0648\u062f\u0627\u0631\u0647\u0627 \u0631\u0648\u0634\u06cc \u0639\u0627\u0644\u06cc \u0628\u0631\u0627\u06cc \u0645\u062f\u0644\u200c\u0633\u0627\u0632\u06cc \u0627\u06cc\u0646 \u0645\u0634\u06a9\u0644 \u0647\u0633\u062a\u0646\u062f \u0648 \u062a\u0631\u062a\u06cc\u0628 \u062a\u0648\u067e\u0648\u0644\u0648\u0698\u06cc\u06a9\u06cc \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u0627\u0632 \u067e\u0631\u062f\u0627\u0632\u0634 \u0648\u0638\u0627\u06cc\u0641 \u0628\u0647 \u062a\u0631\u062a\u06cc\u0628 \u0635\u062d\u06cc\u062d \u0645\u0637\u0645\u0626\u0646 \u0634\u0648\u06cc\u062f.<\/p>\n<p>\u06cc\u06a9\u06cc \u0627\u0632 \u0645\u0648\u0627\u0631\u062f\u06cc \u06a9\u0647 \u062f\u0631 \u0627\u0633\u0646\u0627\u062f \u0648\u062c\u0648\u062f \u0646\u062f\u0627\u0631\u062f \u0627\u06cc\u0646 \u0627\u0633\u062a asyncio \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644\u060c \u0628\u0647 \u0646\u0638\u0631 \u0645\u06cc \u0631\u0633\u062f \u06a9\u0647 \u0646\u0648\u0634\u062a\u0646 \u0622\u0646 \u0628\u0633\u06cc\u0627\u0631 \u0622\u0633\u0627\u0646 \u0627\u0633\u062a. \u0627\u0632 \u0622\u0646\u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0628\u0627 asyncio \u0646\u06cc\u0627\u0632\u06cc \u0646\u06cc\u0633\u062a \u06a9\u0647 \u0628\u0627 thread-safety \u0633\u0631 \u0648 \u06a9\u0627\u0631 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u062f\u0648\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0635\u0641 \u0628\u0631\u0627\u06cc \u0647\u0645\u06af\u0627\u0645\u200c\u0633\u0627\u0632\u06cc \u0646\u062e\u200c\u0647\u0627 \u06cc\u0627 \u0647\u0631 \u06af\u0648\u0646\u0647 \u067e\u06cc\u0686\u06cc\u062f\u06af\u06cc \u0627\u0636\u0627\u0641\u06cc \u062f\u06cc\u06af\u0631\u06cc \u0627\u0632 \u0627\u06cc\u0646 \u062f\u0633\u062a \u0628\u06af\u0630\u0631\u06cc\u062f.<\/p>\n<p>\u0645\u0627 \u06cc\u06a9 \u062a\u0627\u0628\u0639 \u0628\u0627\u0632\u062f\u06cc\u062f\u06a9\u0646\u0646\u062f\u0647 \u06af\u0631\u0647 \u0646\u0627\u0647\u0645\u06af\u0627\u0645 \u0633\u0627\u062f\u0647 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc \u06a9\u0646\u06cc\u0645:<\/p>\n<p>async def visit(node: str, sorter: TopologicalSorter):<br \/>\n    print(f&#8221;processing node {node}&#8221;)<br \/>\n    sorter.done(node)<\/p>\n<p>\u062f\u0631 \u062f\u0646\u06cc\u0627\u06cc \u0648\u0627\u0642\u0639\u06cc\u060c \u0627\u06cc\u0646 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u062a\u0627 \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u0634\u0645\u0627 \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u06cc\u062f \u067e\u06cc\u0686\u06cc\u062f\u0647 \u0628\u0627\u0634\u062f\u060c \u062a\u0627 \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u0634\u0645\u0627 \u06a9\u0627\u0631 I\/O \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc\u200c\u062f\u0647\u06cc\u062f\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0627\u0632 \u0645\u0632\u0627\u06cc\u0627\u06cc asyncio \u0628\u0647\u0631\u0647 \u0628\u0628\u0631\u06cc\u062f. \u0646\u06a9\u062a\u0647 \u0645\u0647\u0645 \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u0628\u0627 \u0622\u0646 \u062a\u0645\u0627\u0633 \u0628\u06af\u06cc\u0631\u06cc\u062f sorter.done(node) \u062f\u0631 \u067e\u0627\u06cc\u0627\u0646 \u062a\u0627\u0628\u0639 \u0627\u062c\u0627\u0632\u0647 \u062f\u0647\u06cc\u062f \u0646\u0645\u0648\u0646\u0647 \u0627\u0632 TopologicalSorter \u0628\u062f\u0627\u0646\u06cc\u062f \u06a9\u0647 \u06a9\u0627\u0631 \u0645\u0627 \u0628\u0627 \u0627\u06cc\u0646 \u06af\u0631\u0647 \u062a\u0645\u0627\u0645 \u0634\u062f\u0647 \u0627\u0633\u062a \u0648 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0628\u0647 \u06af\u0631\u0647 \u0628\u0639\u062f\u06cc \u0628\u0631\u0648\u06cc\u0645.<\/p>\n<p>\u0633\u067e\u0633 \u0622\u0646 \u0631\u0627 \u0648\u0635\u0644 \u0645\u06cc \u06a9\u0646\u06cc\u0645 visit \u062f\u0631 \u0627\u062c\u0631\u0627\u06cc \u0645\u0631\u062a\u0628 \u0634\u062f\u0647 \u062a\u0648\u067e\u0648\u0644\u0648\u0698\u06cc\u06a9\u06cc \u0645\u0627 \u0639\u0645\u0644 \u06a9\u0646\u06cc\u062f:<\/p>\n<p>sorter = TopologicalSorter(graph)<\/p>\n<p>sorter.prepare()<\/p>\n<p>while sorter.is_active():<br \/>\n    node_group = sorter.get_ready()<\/p>\n<p>    if not node_group:<br \/>\n        # no nodes are ready yet, so we sleep for a bit<br \/>\n        await asyncio.sleep(0.25)<br \/>\n    else:<br \/>\n        tasks = set()<br \/>\n        for node in node_group:<br \/>\n            task = asyncio.create_task(visit(node, sorter))<br \/>\n            tasks.add(task)<br \/>\n            task.add_done_callback(tasks.discard)<\/p>\n<p>\u06a9\u062f \u0645\u0646\u0628\u0639 \u06a9\u0627\u0645\u0644 \u06cc\u06a9 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u06a9\u0627\u0631 \u0631\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646 \u062f\u0631 \u0627\u06cc\u0646 \u0627\u0635\u0644 \u06cc\u0627\u0641\u062a.<\/p>\n<p>\u06cc\u06a9 \u062c\u0646\u0628\u0647 \u062e\u0627\u0635 \u0627\u0632 graphlib \u0641\u0631\u0645\u062a \u0646\u0645\u0648\u062f\u0627\u0631 \u0627\u0633\u062a TopologicalSorter \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u0622\u0631\u06af\u0648\u0645\u0627\u0646 \u0645\u06cc \u067e\u0630\u06cc\u0631\u062f &#8212; \u0628\u0647 \u062a\u0631\u062a\u06cc\u0628 \u0645\u0639\u06a9\u0648\u0633 \u0627\u0632 \u0646\u0645\u0627\u06cc\u0634 \u0645\u0639\u0645\u0648\u0644\u06cc \u0634\u0645\u0627 \u0627\u0632 \u06cc\u06a9 \u0646\u0645\u0648\u062f\u0627\u0631 \u0627\u0633\u062a. \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644 \u0627\u06af\u0631 \u0634\u0645\u0627 \u06cc\u06a9 \u0646\u0645\u0648\u062f\u0627\u0631 \u0645\u0627\u0646\u0646\u062f \u0627\u06cc\u0646 \u062f\u0627\u0631\u06cc\u062f A -&gt; B -&gt; C\u060c \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0634\u0645\u0627 \u0628\u0627\u06cc\u062f \u0622\u0646 \u0631\u0627 \u0627\u06cc\u0646\u06af\u0648\u0646\u0647 \u0646\u0634\u0627\u0646 \u062f\u0647\u06cc\u062f:<\/p>\n<p>graph = {<br \/>\n  &#8220;A&#8221;: [&#8220;B&#8221;],<br \/>\n  &#8220;B&#8221;: [&#8220;C&#8221;],<br \/>\n  &#8220;C&#8221;: [],<br \/>\n}<\/p>\n<p>\u0627\u0645\u0627 TopologicalSorter \u0645\u06cc \u062e\u0648\u0627\u0647\u062f \u0627\u06cc\u0646 \u0646\u0645\u0648\u062f\u0627\u0631 \u062f\u0631 \u062c\u0647\u062a \u0644\u0628\u0647 \u0645\u0639\u06a9\u0648\u0633 \u0634\u0648\u062f:<\/p>\n<p>\u0627\u06af\u0631 \u0622\u0631\u06af\u0648\u0645\u0627\u0646 \u06af\u0631\u0627\u0641 \u0627\u062e\u062a\u06cc\u0627\u0631\u06cc \u0627\u0631\u0627\u0626\u0647 \u0634\u0648\u062f\u060c \u0628\u0627\u06cc\u062f \u0641\u0631\u0647\u0646\u06af \u0644\u063a\u062a\u06cc \u0628\u0627\u0634\u062f \u06a9\u0647 \u06cc\u06a9 \u06af\u0631\u0627\u0641 \u063a\u06cc\u0631 \u0686\u0631\u062e\u0647 \u0627\u06cc \u062c\u0647\u062a \u062f\u0627\u0631 \u0631\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u06a9\u0647 \u062f\u0631 \u0622\u0646 \u06a9\u0644\u06cc\u062f\u0647\u0627 \u06af\u0631\u0647 \u0647\u0633\u062a\u0646\u062f \u0648 \u0645\u0642\u0627\u062f\u06cc\u0631 \u062a\u06a9\u0631\u0627\u0631\u067e\u0630\u06cc\u0631 \u0647\u0645\u0647 \u067e\u06cc\u0634\u06cc\u0646\u06cc\u0627\u0646 \u0622\u0646 \u06af\u0631\u0647 \u062f\u0631 \u06af\u0631\u0627\u0641 \u0647\u0633\u062a\u0646\u062f.<\/p>\n<p>\u067e\u0633 \u0631\u0627\u0647 \u062f\u0631\u0633\u062a \u0646\u0645\u0627\u06cc\u0646\u062f\u06af\u06cc A -&gt; B -&gt; C \u0628\u0631\u0627\u06cc TopologicalSorter \u0627\u06cc\u0646 \u0627\u0633\u062a:<\/p>\n<p>graph = {<br \/>\n  &#8220;C&#8221;: [&#8220;B&#8221;],<br \/>\n  &#8220;B&#8221;: [&#8220;A&#8221;],<br \/>\n  &#8220;A&#8221;: [],<br \/>\n}<\/p>\n<p>\u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0628\u06cc\u0634\u062a\u0631 \u0648 \u06cc\u06a9 \u0628\u062d\u062b \u0646\u0633\u0628\u062a\u0627\u064b \u062f\u0627\u063a \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0648\u0631\u062f \u0631\u0627 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f: https:\/\/bugs.python.org\/issue46071.<\/p>\n<p>\u06a9\u062f \u0646\u0648\u06cc\u0633\u06cc \u0645\u0628\u0627\u0631\u06a9!<\/p>\n<p>\u0627\u062e\u06cc\u0631\u0627\u064b \u0628\u0627 \u06cc\u06a9 \u0645\u0627\u0698\u0648\u0644 \u062c\u0627\u0644\u0628 \u062f\u0631 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0627\u0633\u062a\u0627\u0646\u062f\u0627\u0631\u062f \u0628\u06cc \u0627\u0646\u062a\u0647\u0627 \u067e\u0627\u06cc\u062a\u0648\u0646 \u0645\u0648\u0627\u062c\u0647 \u0634\u062f\u0645: graphlib. \u0627\u06af\u0631 \u0642\u0628\u0644\u0627\u064b \u0628\u0627 \u0622\u0646 \u06a9\u0627\u0631 \u0646\u06a9\u0631\u062f\u0647 \u0627\u06cc\u062f\u060c \u0627\u06cc\u0646 \u06cc\u06a9 \u0627\u0628\u0632\u0627\u0631 \u06a9\u0648\u0686\u06a9 \u0627\u0633\u062a \u06a9\u0647 \u062f\u0631 Python 3.9 \u0627\u0636\u0627\u0641\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a \u0648 \u0641\u0642\u0637 \u06cc\u06a9 \u06a9\u0644\u0627\u0633 \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0645\u06cc \u06a9\u0646\u062f: TopologicalSorter.<\/p>\n<p>\u0646\u0627\u0645 \u062e\u0648\u062f \u062a\u0648\u0636\u06cc\u062d\u06cc \u0627\u0633\u062a &#8212; \u0627\u06cc\u0646 \u06cc\u06a9 \u06a9\u0644\u0627\u0633 \u0628\u0631\u0627\u06cc \u0645\u0631\u062a\u0628 \u0633\u0627\u0632\u06cc \u062a\u0648\u067e\u0648\u0644\u0648\u0698\u06cc\u06a9\u06cc \u06cc\u06a9 \u0646\u0645\u0648\u062f\u0627\u0631 \u0627\u0633\u062a. \u0627\u0645\u0627 \u0645\u0646 \u0641\u06a9\u0631 \u0646\u0645\u06cc\u200c\u06a9\u0646\u0645 \u06a9\u0647 \u062f\u0631 \u0627\u0628\u062a\u062f\u0627 \u0641\u0642\u0637 \u0628\u0627 \u0645\u0631\u062a\u0628\u200c\u0633\u0627\u0632\u06cc \u0646\u0648\u0634\u062a\u0647 \u0634\u062f\u0647 \u0628\u0627\u0634\u062f\u060c \u0632\u06cc\u0631\u0627 API \u0646\u0633\u0628\u062a\u0627\u064b \u0645\u0631\u0645\u0648\u0632\u060c \u0627\u0645\u0627 \u0641\u0648\u0642\u200c\u0627\u0644\u0639\u0627\u062f\u0647 \u0645\u0641\u06cc\u062f\u06cc \u062f\u0627\u0631\u062f\u060c \u0645\u0627\u0646\u0646\u062f <code>prepare()<\/code> \u0631\u0648\u0634 \u06cc\u0627 <code>is_active()<\/code>. \u0627\u06cc\u0646 \u0645\u062b\u0627\u0644 \u062f\u0631 \u0645\u0633\u062a\u0646\u062f\u0627\u062a \u0628\u0647 \u0627\u0646\u06af\u06cc\u0632\u0647 \u067e\u0634\u062a \u0622\u0646 \u0627\u0634\u0627\u0631\u0647 \u0645\u06cc \u06a9\u0646\u062f:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"n\">topological_sorter<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">TopologicalSorter<\/span><span class=\"p\">()<\/span>\n\n<span class=\"c1\"># Add nodes to 'topological_sorter'...\n<\/span>\n<span class=\"n\">topological_sorter<\/span><span class=\"p\">.<\/span><span class=\"nf\">prepare<\/span><span class=\"p\">()<\/span>\n<span class=\"k\">while<\/span> <span class=\"n\">topological_sorter<\/span><span class=\"p\">.<\/span><span class=\"nf\">is_active<\/span><span class=\"p\">():<\/span>\n    <span class=\"k\">for<\/span> <span class=\"n\">node<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">topological_sorter<\/span><span class=\"p\">.<\/span><span class=\"nf\">get_ready<\/span><span class=\"p\">():<\/span>\n        <span class=\"c1\"># Worker threads or processes take nodes to work on off the\n<\/span>        <span class=\"c1\"># 'task_queue' queue.\n<\/span>        <span class=\"n\">task_queue<\/span><span class=\"p\">.<\/span><span class=\"nf\">put<\/span><span class=\"p\">(<\/span><span class=\"n\">node<\/span><span class=\"p\">)<\/span>\n\n    <span class=\"c1\"># When the work for a node is done, workers put the node in\n<\/span>    <span class=\"c1\"># 'finalized_tasks_queue' so we can get more nodes to work on.\n<\/span>    <span class=\"c1\"># The definition of 'is_active()' guarantees that, at this point, at\n<\/span>    <span class=\"c1\"># least one node has been placed on 'task_queue' that hasn't yet\n<\/span>    <span class=\"c1\"># been passed to 'done()', so this blocking 'get()' must (eventually)\n<\/span>    <span class=\"c1\"># succeed.  After calling 'done()', we loop back to call 'get_ready()'\n<\/span>    <span class=\"c1\"># again, so put newly freed nodes on 'task_queue' as soon as\n<\/span>    <span class=\"c1\"># logically possible.\n<\/span>    <span class=\"n\">node<\/span> <span class=\"o\">=<\/span> <span class=\"n\">finalized_tasks_queue<\/span><span class=\"p\">.<\/span><span class=\"nf\">get<\/span><span class=\"p\">()<\/span>\n    <span class=\"n\">topological_sorter<\/span><span class=\"p\">.<\/span><span class=\"nf\">done<\/span><span class=\"p\">(<\/span><span class=\"n\">node<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 <code>graphlib<\/code> \u06cc\u06a9 \u0645\u0627\u0698\u0648\u0644 \u0641\u0642\u0637 \u0628\u0631\u0627\u06cc \u0645\u0631\u062a\u0628\u200c\u0633\u0627\u0632\u06cc \u0646\u0645\u0648\u062f\u0627\u0631\u0647\u0627 \u0646\u06cc\u0633\u062a\u060c \u0628\u0644\u06a9\u0647 \u0627\u0628\u0632\u0627\u0631\u06cc \u0628\u0631\u0627\u06cc \u0627\u062c\u0631\u0627\u06cc \u0646\u0645\u0648\u062f\u0627\u0631\u0647\u0627\u06cc \u0648\u0638\u0627\u06cc\u0641 \u0628\u0647 \u062a\u0631\u062a\u06cc\u0628 \u062a\u0648\u067e\u0648\u0644\u0648\u0698\u06cc\u06a9\u06cc \u0627\u0633\u062a\u060c \u06a9\u0647 \u062f\u0631 \u0635\u0648\u0631\u062a\u06cc \u0645\u0641\u06cc\u062f \u0627\u0633\u062a \u06a9\u0647 \u062d\u062c\u0645 \u06a9\u0627\u0631\u06cc \u0634\u0645\u0627 \u0628\u0633\u062a\u0647 \u0628\u0647 \u0646\u062a\u0627\u06cc\u062c \u06a9\u0627\u0631\u0647\u0627\u06cc \u062f\u06cc\u06af\u0631 \u0648\u0638\u0627\u06cc\u0641\u06cc \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u062f. \u0646\u0645\u0648\u062f\u0627\u0631\u0647\u0627 \u0631\u0648\u0634\u06cc \u0639\u0627\u0644\u06cc \u0628\u0631\u0627\u06cc \u0645\u062f\u0644\u200c\u0633\u0627\u0632\u06cc \u0627\u06cc\u0646 \u0645\u0634\u06a9\u0644 \u0647\u0633\u062a\u0646\u062f \u0648 \u062a\u0631\u062a\u06cc\u0628 \u062a\u0648\u067e\u0648\u0644\u0648\u0698\u06cc\u06a9\u06cc \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u0686\u06af\u0648\u0646\u0647 \u0627\u0632 \u067e\u0631\u062f\u0627\u0632\u0634 \u0648\u0638\u0627\u06cc\u0641 \u0628\u0647 \u062a\u0631\u062a\u06cc\u0628 \u0635\u062d\u06cc\u062d \u0645\u0637\u0645\u0626\u0646 \u0634\u0648\u06cc\u062f.<\/p>\n<p>\u06cc\u06a9\u06cc \u0627\u0632 \u0645\u0648\u0627\u0631\u062f\u06cc \u06a9\u0647 \u062f\u0631 \u0627\u0633\u0646\u0627\u062f \u0648\u062c\u0648\u062f \u0646\u062f\u0627\u0631\u062f \u0627\u06cc\u0646 \u0627\u0633\u062a <code>asyncio<\/code> \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644\u060c \u0628\u0647 \u0646\u0638\u0631 \u0645\u06cc \u0631\u0633\u062f \u06a9\u0647 \u0646\u0648\u0634\u062a\u0646 \u0622\u0646 \u0628\u0633\u06cc\u0627\u0631 \u0622\u0633\u0627\u0646 \u0627\u0633\u062a. \u0627\u0632 \u0622\u0646\u062c\u0627\u06cc\u06cc \u06a9\u0647 \u0628\u0627 <code>asyncio<\/code> \u0646\u06cc\u0627\u0632\u06cc \u0646\u06cc\u0633\u062a \u06a9\u0647 \u0628\u0627 thread-safety \u0633\u0631 \u0648 \u06a9\u0627\u0631 \u062f\u0627\u0634\u062a\u0647 \u0628\u0627\u0634\u06cc\u062f\u060c \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u0628\u062f\u0648\u0646 \u0627\u0633\u062a\u0641\u0627\u062f\u0647 \u0627\u0632 \u0635\u0641 \u0628\u0631\u0627\u06cc \u0647\u0645\u06af\u0627\u0645\u200c\u0633\u0627\u0632\u06cc \u0646\u062e\u200c\u0647\u0627 \u06cc\u0627 \u0647\u0631 \u06af\u0648\u0646\u0647 \u067e\u06cc\u0686\u06cc\u062f\u06af\u06cc \u0627\u0636\u0627\u0641\u06cc \u062f\u06cc\u06af\u0631\u06cc \u0627\u0632 \u0627\u06cc\u0646 \u062f\u0633\u062a \u0628\u06af\u0630\u0631\u06cc\u062f.<\/p>\n<p>\u0645\u0627 \u06cc\u06a9 \u062a\u0627\u0628\u0639 \u0628\u0627\u0632\u062f\u06cc\u062f\u06a9\u0646\u0646\u062f\u0647 \u06af\u0631\u0647 \u0646\u0627\u0647\u0645\u06af\u0627\u0645 \u0633\u0627\u062f\u0647 \u062a\u0639\u0631\u06cc\u0641 \u0645\u06cc \u06a9\u0646\u06cc\u0645:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"k\">async<\/span> <span class=\"k\">def<\/span> <span class=\"nf\">visit<\/span><span class=\"p\">(<\/span><span class=\"n\">node<\/span><span class=\"p\">:<\/span> <span class=\"nb\">str<\/span><span class=\"p\">,<\/span> <span class=\"n\">sorter<\/span><span class=\"p\">:<\/span> <span class=\"n\">TopologicalSorter<\/span><span class=\"p\">):<\/span>\n    <span class=\"nf\">print<\/span><span class=\"p\">(<\/span><span class=\"sa\">f<\/span><span class=\"sh\">\"<\/span><span class=\"s\">processing node <\/span><span class=\"si\">{<\/span><span class=\"n\">node<\/span><span class=\"si\">}<\/span><span class=\"sh\">\"<\/span><span class=\"p\">)<\/span>\n    <span class=\"n\">sorter<\/span><span class=\"p\">.<\/span><span class=\"nf\">done<\/span><span class=\"p\">(<\/span><span class=\"n\">node<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u062f\u0631 \u062f\u0646\u06cc\u0627\u06cc \u0648\u0627\u0642\u0639\u06cc\u060c \u0627\u06cc\u0646 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u062f \u062a\u0627 \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u0634\u0645\u0627 \u0645\u06cc\u200c\u062e\u0648\u0627\u0647\u06cc\u062f \u067e\u06cc\u0686\u06cc\u062f\u0647 \u0628\u0627\u0634\u062f\u060c \u062a\u0627 \u0632\u0645\u0627\u0646\u06cc \u06a9\u0647 \u0634\u0645\u0627 \u06a9\u0627\u0631 I\/O \u0631\u0627 \u0627\u0646\u062c\u0627\u0645 \u0645\u06cc\u200c\u062f\u0647\u06cc\u062f\u060c \u0628\u0646\u0627\u0628\u0631\u0627\u06cc\u0646 \u0627\u0632 \u0645\u0632\u0627\u06cc\u0627\u06cc asyncio \u0628\u0647\u0631\u0647 \u0628\u0628\u0631\u06cc\u062f. \u0646\u06a9\u062a\u0647 \u0645\u0647\u0645 \u0627\u06cc\u0646 \u0627\u0633\u062a \u06a9\u0647 \u0628\u0627 \u0622\u0646 \u062a\u0645\u0627\u0633 \u0628\u06af\u06cc\u0631\u06cc\u062f <code>sorter.done(node)<\/code> \u062f\u0631 \u067e\u0627\u06cc\u0627\u0646 \u062a\u0627\u0628\u0639 \u0627\u062c\u0627\u0632\u0647 \u062f\u0647\u06cc\u062f \u0646\u0645\u0648\u0646\u0647 \u0627\u0632 <code>TopologicalSorter<\/code> \u0628\u062f\u0627\u0646\u06cc\u062f \u06a9\u0647 \u06a9\u0627\u0631 \u0645\u0627 \u0628\u0627 \u0627\u06cc\u0646 \u06af\u0631\u0647 \u062a\u0645\u0627\u0645 \u0634\u062f\u0647 \u0627\u0633\u062a \u0648 \u0645\u06cc \u062a\u0648\u0627\u0646\u06cc\u0645 \u0628\u0647 \u06af\u0631\u0647 \u0628\u0639\u062f\u06cc \u0628\u0631\u0648\u06cc\u0645.<\/p>\n<p>\u0633\u067e\u0633 \u0622\u0646 \u0631\u0627 \u0648\u0635\u0644 \u0645\u06cc \u06a9\u0646\u06cc\u0645 <code>visit<\/code> \u062f\u0631 \u0627\u062c\u0631\u0627\u06cc \u0645\u0631\u062a\u0628 \u0634\u062f\u0647 \u062a\u0648\u067e\u0648\u0644\u0648\u0698\u06cc\u06a9\u06cc \u0645\u0627 \u0639\u0645\u0644 \u06a9\u0646\u06cc\u062f:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"n\">sorter<\/span> <span class=\"o\">=<\/span> <span class=\"nc\">TopologicalSorter<\/span><span class=\"p\">(<\/span><span class=\"n\">graph<\/span><span class=\"p\">)<\/span>\n\n<span class=\"n\">sorter<\/span><span class=\"p\">.<\/span><span class=\"nf\">prepare<\/span><span class=\"p\">()<\/span>\n\n<span class=\"k\">while<\/span> <span class=\"n\">sorter<\/span><span class=\"p\">.<\/span><span class=\"nf\">is_active<\/span><span class=\"p\">():<\/span>\n    <span class=\"n\">node_group<\/span> <span class=\"o\">=<\/span> <span class=\"n\">sorter<\/span><span class=\"p\">.<\/span><span class=\"nf\">get_ready<\/span><span class=\"p\">()<\/span>\n\n    <span class=\"k\">if<\/span> <span class=\"ow\">not<\/span> <span class=\"n\">node_group<\/span><span class=\"p\">:<\/span>\n        <span class=\"c1\"># no nodes are ready yet, so we sleep for a bit\n<\/span>        <span class=\"k\">await<\/span> <span class=\"n\">asyncio<\/span><span class=\"p\">.<\/span><span class=\"nf\">sleep<\/span><span class=\"p\">(<\/span><span class=\"mf\">0.25<\/span><span class=\"p\">)<\/span>\n    <span class=\"k\">else<\/span><span class=\"p\">:<\/span>\n        <span class=\"n\">tasks<\/span> <span class=\"o\">=<\/span> <span class=\"nf\">set<\/span><span class=\"p\">()<\/span>\n        <span class=\"k\">for<\/span> <span class=\"n\">node<\/span> <span class=\"ow\">in<\/span> <span class=\"n\">node_group<\/span><span class=\"p\">:<\/span>\n            <span class=\"n\">task<\/span> <span class=\"o\">=<\/span> <span class=\"n\">asyncio<\/span><span class=\"p\">.<\/span><span class=\"nf\">create_task<\/span><span class=\"p\">(<\/span><span class=\"nf\">visit<\/span><span class=\"p\">(<\/span><span class=\"n\">node<\/span><span class=\"p\">,<\/span> <span class=\"n\">sorter<\/span><span class=\"p\">))<\/span>\n            <span class=\"n\">tasks<\/span><span class=\"p\">.<\/span><span class=\"nf\">add<\/span><span class=\"p\">(<\/span><span class=\"n\">task<\/span><span class=\"p\">)<\/span>\n            <span class=\"n\">task<\/span><span class=\"p\">.<\/span><span class=\"nf\">add_done_callback<\/span><span class=\"p\">(<\/span><span class=\"n\">tasks<\/span><span class=\"p\">.<\/span><span class=\"n\">discard<\/span><span class=\"p\">)<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u06a9\u062f \u0645\u0646\u0628\u0639 \u06a9\u0627\u0645\u0644 \u06cc\u06a9 \u0627\u0633\u06a9\u0631\u06cc\u067e\u062a \u06a9\u0627\u0631 \u0631\u0627 \u0645\u06cc \u062a\u0648\u0627\u0646 \u062f\u0631 \u0627\u06cc\u0646 \u0627\u0635\u0644 \u06cc\u0627\u0641\u062a.<\/p>\n<p>\u06cc\u06a9 \u062c\u0646\u0628\u0647 \u062e\u0627\u0635 \u0627\u0632 <code>graphlib<\/code> \u0641\u0631\u0645\u062a \u0646\u0645\u0648\u062f\u0627\u0631 \u0627\u0633\u062a <code>TopologicalSorter<\/code> \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u06cc\u06a9 \u0622\u0631\u06af\u0648\u0645\u0627\u0646 \u0645\u06cc \u067e\u0630\u06cc\u0631\u062f &#8212; \u0628\u0647 \u062a\u0631\u062a\u06cc\u0628 \u0645\u0639\u06a9\u0648\u0633 \u0627\u0632 \u0646\u0645\u0627\u06cc\u0634 \u0645\u0639\u0645\u0648\u0644\u06cc \u0634\u0645\u0627 \u0627\u0632 \u06cc\u06a9 \u0646\u0645\u0648\u062f\u0627\u0631 \u0627\u0633\u062a. \u0628\u0647 \u0639\u0646\u0648\u0627\u0646 \u0645\u062b\u0627\u0644 \u0627\u06af\u0631 \u0634\u0645\u0627 \u06cc\u06a9 \u0646\u0645\u0648\u062f\u0627\u0631 \u0645\u0627\u0646\u0646\u062f \u0627\u06cc\u0646 \u062f\u0627\u0631\u06cc\u062f <code>A -&gt; B -&gt; C<\/code>\u060c \u0645\u0639\u0645\u0648\u0644\u0627\u064b \u0634\u0645\u0627 \u0628\u0627\u06cc\u062f \u0622\u0646 \u0631\u0627 \u0627\u06cc\u0646\u06af\u0648\u0646\u0647 \u0646\u0634\u0627\u0646 \u062f\u0647\u06cc\u062f:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"n\">graph<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n  <span class=\"sh\">\"<\/span><span class=\"s\">A<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"sh\">\"<\/span><span class=\"s\">B<\/span><span class=\"sh\">\"<\/span><span class=\"p\">],<\/span>\n  <span class=\"sh\">\"<\/span><span class=\"s\">B<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"sh\">\"<\/span><span class=\"s\">C<\/span><span class=\"sh\">\"<\/span><span class=\"p\">],<\/span>\n  <span class=\"sh\">\"<\/span><span class=\"s\">C<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[],<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0627\u0645\u0627 <code>TopologicalSorter<\/code> \u0645\u06cc \u062e\u0648\u0627\u0647\u062f \u0627\u06cc\u0646 \u0646\u0645\u0648\u062f\u0627\u0631 \u062f\u0631 \u062c\u0647\u062a \u0644\u0628\u0647 \u0645\u0639\u06a9\u0648\u0633 \u0634\u0648\u062f:<\/p>\n<blockquote>\n<p>\u0627\u06af\u0631 \u0622\u0631\u06af\u0648\u0645\u0627\u0646 \u06af\u0631\u0627\u0641 \u0627\u062e\u062a\u06cc\u0627\u0631\u06cc \u0627\u0631\u0627\u0626\u0647 \u0634\u0648\u062f\u060c \u0628\u0627\u06cc\u062f \u0641\u0631\u0647\u0646\u06af \u0644\u063a\u062a\u06cc \u0628\u0627\u0634\u062f \u06a9\u0647 \u06cc\u06a9 \u06af\u0631\u0627\u0641 \u063a\u06cc\u0631 \u0686\u0631\u062e\u0647 \u0627\u06cc \u062c\u0647\u062a \u062f\u0627\u0631 \u0631\u0627 \u0646\u0634\u0627\u0646 \u0645\u06cc \u062f\u0647\u062f \u06a9\u0647 \u062f\u0631 \u0622\u0646 \u06a9\u0644\u06cc\u062f\u0647\u0627 \u06af\u0631\u0647 \u0647\u0633\u062a\u0646\u062f \u0648 \u0645\u0642\u0627\u062f\u06cc\u0631 \u062a\u06a9\u0631\u0627\u0631\u067e\u0630\u06cc\u0631 \u0647\u0645\u0647 \u067e\u06cc\u0634\u06cc\u0646\u06cc\u0627\u0646 \u0622\u0646 \u06af\u0631\u0647 \u062f\u0631 \u06af\u0631\u0627\u0641 \u0647\u0633\u062a\u0646\u062f.<\/p>\n<\/blockquote>\n<p>\u067e\u0633 \u0631\u0627\u0647 \u062f\u0631\u0633\u062a \u0646\u0645\u0627\u06cc\u0646\u062f\u06af\u06cc <code>A -&gt; B -&gt; C<\/code> \u0628\u0631\u0627\u06cc <code>TopologicalSorter<\/code> \u0627\u06cc\u0646 \u0627\u0633\u062a:\n<\/p>\n<div class=\"highlight js-code-highlight\">\n<pre class=\"highlight python\"><code><span class=\"n\">graph<\/span> <span class=\"o\">=<\/span> <span class=\"p\">{<\/span>\n  <span class=\"sh\">\"<\/span><span class=\"s\">C<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"sh\">\"<\/span><span class=\"s\">B<\/span><span class=\"sh\">\"<\/span><span class=\"p\">],<\/span>\n  <span class=\"sh\">\"<\/span><span class=\"s\">B<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[<\/span><span class=\"sh\">\"<\/span><span class=\"s\">A<\/span><span class=\"sh\">\"<\/span><span class=\"p\">],<\/span>\n  <span class=\"sh\">\"<\/span><span class=\"s\">A<\/span><span class=\"sh\">\"<\/span><span class=\"p\">:<\/span> <span class=\"p\">[],<\/span>\n<span class=\"p\">}<\/span>\n<\/code><\/pre>\n<\/div>\n<p>\u0627\u0637\u0644\u0627\u0639\u0627\u062a \u0628\u06cc\u0634\u062a\u0631 \u0648 \u06cc\u06a9 \u0628\u062d\u062b \u0646\u0633\u0628\u062a\u0627\u064b \u062f\u0627\u063a \u062f\u0631 \u0627\u06cc\u0646 \u0645\u0648\u0631\u062f \u0631\u0627 \u0645\u06cc\u200c\u062a\u0648\u0627\u0646\u06cc\u062f \u062f\u0631 \u0627\u06cc\u0646\u062c\u0627 \u067e\u06cc\u062f\u0627 \u06a9\u0646\u06cc\u062f: https:\/\/bugs.python.org\/issue46071.<\/p>\n<p>\u06a9\u062f \u0646\u0648\u06cc\u0633\u06cc \u0645\u0628\u0627\u0631\u06a9!<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Summarize this content to 400 words in Persian Lang \u0627\u062e\u06cc\u0631\u0627\u064b \u0628\u0627 \u06cc\u06a9 \u0645\u0627\u0698\u0648\u0644 \u062c\u0627\u0644\u0628 \u062f\u0631 \u06a9\u062a\u0627\u0628\u062e\u0627\u0646\u0647 \u0627\u0633\u062a\u0627\u0646\u062f\u0627\u0631\u062f \u0628\u06cc \u0627\u0646\u062a\u0647\u0627 \u067e\u0627\u06cc\u062a\u0648\u0646 \u0645\u0648\u0627\u062c\u0647 \u0634\u062f\u0645: graphlib. \u0627\u06af\u0631 \u0642\u0628\u0644\u0627\u064b \u0628\u0627 \u0622\u0646 \u06a9\u0627\u0631 \u0646\u06a9\u0631\u062f\u0647 \u0627\u06cc\u062f\u060c \u0627\u06cc\u0646 \u06cc\u06a9 \u0627\u0628\u0632\u0627\u0631 \u06a9\u0648\u0686\u06a9 \u0627\u0633\u062a \u06a9\u0647 \u062f\u0631 Python 3.9 \u0627\u0636\u0627\u0641\u0647 \u0634\u062f\u0647 \u0627\u0633\u062a \u0648 \u0641\u0642\u0637 \u06cc\u06a9 \u06a9\u0644\u0627\u0633 \u0631\u0627 \u067e\u06cc\u0627\u062f\u0647 \u0633\u0627\u0632\u06cc \u0645\u06cc \u06a9\u0646\u062f: TopologicalSorter. \u0646\u0627\u0645 \u062e\u0648\u062f \u062a\u0648\u0636\u06cc\u062d\u06cc &hellip;<\/p>\n","protected":false},"author":2,"featured_media":0,"comment_status":"open","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"fifu_image_url":"","fifu_image_alt":"","footnotes":""},"categories":[339],"tags":[],"class_list":["post-74840","post","type-post","status-publish","format-standard","hentry","category-dev"],"_links":{"self":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/74840","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/comments?post=74840"}],"version-history":[{"count":0,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/posts\/74840\/revisions"}],"wp:attachment":[{"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/media?parent=74840"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/categories?post=74840"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/nabfollower.com\/blog\/wp-json\/wp\/v2\/tags?post=74840"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}