Skip to content

Commit c34a169

Browse files
author
Pyrogram-Mod - Dev
committed
fixed some issue with async, asyncio etc
1 parent 3992515 commit c34a169

6 files changed

Lines changed: 72 additions & 13 deletions

File tree

pyrogram/client.py

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,7 @@ def __init__(
330330
self.updates_watchdog_event = asyncio.Event()
331331
self.last_update_time = datetime.now()
332332

333-
self.loop = asyncio.get_event_loop()
333+
self.loop = None
334334
self.config_file = config_file
335335

336336
def __enter__(self):
@@ -1359,4 +1359,4 @@ def __setitem__(self, key, value):
13591359

13601360
if len(self.store) > self.capacity:
13611361
for _ in range(self.capacity // 2 + 1):
1362-
del self.store[next(iter(self.store))]
1362+
del self.store[next(iter(self.store))]

pyrogram/dispatcher.py

Lines changed: 28 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class Dispatcher:
5555

5656
def __init__(self, client: "pyrogram.Client"):
5757
self.client = client
58-
self.loop = asyncio.get_event_loop()
58+
self.loop = None
5959

6060
self.handler_worker_tasks = []
6161
self.locks_list = []
@@ -144,12 +144,19 @@ async def chat_join_request_parser(update, users, chats):
144144

145145
async def start(self):
146146
if not self.client.no_updates:
147+
loop = asyncio.get_running_loop()
148+
self.loop = loop
149+
147150
for i in range(self.client.workers):
148151
self.locks_list.append(asyncio.Lock())
149152

150-
self.handler_worker_tasks.append(
151-
self.loop.create_task(self.handler_worker(self.locks_list[-1]))
152-
)
153+
task = loop.create_task(self.handler_worker(self.locks_list[-1]))
154+
155+
# Avoid noisy \"Task was destroyed but it is pending\" warnings when the loop exits abruptly.
156+
if hasattr(task, "_log_destroy_pending"):
157+
task._log_destroy_pending = False
158+
159+
self.handler_worker_tasks.append(task)
153160

154161
log.info("Started %s HandlerTasks", self.client.workers)
155162

@@ -169,7 +176,17 @@ async def stop(self):
169176

170177
log.info("Stopped %s HandlerTasks", self.client.workers)
171178

179+
self.loop = None
180+
172181
def add_handler(self, handler, group: int):
182+
if self.loop is None or not self.handler_worker_tasks:
183+
if group not in self.groups:
184+
self.groups[group] = []
185+
self.groups = OrderedDict(sorted(self.groups.items()))
186+
187+
self.groups[group].append(handler)
188+
return
189+
173190
async def fn():
174191
for lock in self.locks_list:
175192
await lock.acquire()
@@ -187,6 +204,13 @@ async def fn():
187204
self.loop.create_task(fn())
188205

189206
def remove_handler(self, handler, group: int):
207+
if self.loop is None or not self.handler_worker_tasks:
208+
if group not in self.groups:
209+
raise ValueError(f"Group {group} does not exist. Handler was not removed.")
210+
211+
self.groups[group].remove(handler)
212+
return
213+
190214
async def fn():
191215
for lock in self.locks_list:
192216
await lock.acquire()

pyrogram/methods/auth/initialize.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -49,4 +49,7 @@ async def initialize(
4949

5050
self.updates_watchdog_task = asyncio.create_task(self.updates_watchdog())
5151

52+
if hasattr(self.updates_watchdog_task, "_log_destroy_pending"):
53+
self.updates_watchdog_task._log_destroy_pending = False
54+
5255
self.is_initialized = True

pyrogram/methods/utilities/start.py

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
# You should have received a copy of the GNU Lesser General Public License
1717
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
1818

19+
import asyncio
1920
import logging
2021

2122
import pyrogram
@@ -55,6 +56,8 @@ async def main():
5556
5657
app.run(main())
5758
"""
59+
self.loop = asyncio.get_running_loop()
60+
5861
is_authorized = await self.connect()
5962

6063
try:

pyrogram/methods/utilities/stop.py

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,8 @@
1616
# You should have received a copy of the GNU Lesser General Public License
1717
# along with Pyrogram. If not, see <http://www.gnu.org/licenses/>.
1818

19+
import asyncio
20+
1921
import pyrogram
2022

2123

@@ -60,10 +62,12 @@ async def main():
6062
async def do_it():
6163
await self.terminate()
6264
await self.disconnect()
65+
self.loop = None
6366

6467
if block:
6568
await do_it()
6669
else:
67-
self.loop.create_task(do_it())
70+
loop = self.loop or asyncio.get_running_loop()
71+
loop.create_task(do_it())
6872

6973
return self

pyrogram/session/session.py

Lines changed: 31 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -102,9 +102,11 @@ def __init__(
102102

103103
self.is_started = asyncio.Event()
104104

105-
self.loop = asyncio.get_event_loop()
105+
self.loop = None
106106

107107
async def start(self):
108+
self.loop = asyncio.get_running_loop()
109+
108110
while True:
109111
self.connection = self.client.connection_factory(
110112
dc_id=self.dc_id,
@@ -120,6 +122,9 @@ async def start(self):
120122

121123
self.recv_task = self.loop.create_task(self.recv_worker())
122124

125+
if hasattr(self.recv_task, "_log_destroy_pending"):
126+
self.recv_task._log_destroy_pending = False
127+
123128
await self.send(raw.functions.Ping(ping_id=0), timeout=self.START_TIMEOUT)
124129

125130
if not self.is_cdn:
@@ -142,6 +147,9 @@ async def start(self):
142147

143148
self.ping_task = self.loop.create_task(self.ping_worker())
144149

150+
if hasattr(self.ping_task, "_log_destroy_pending"):
151+
self.ping_task._log_destroy_pending = False
152+
145153
log.info("Session initialized: Layer %s", layer)
146154
log.info("Device: %s - %s", self.client.device_model, self.client.app_version)
147155
log.info("System: %s (%s)", self.client.system_version, self.client.lang_code)
@@ -185,6 +193,8 @@ async def stop(self):
185193

186194
log.info("Session stopped")
187195

196+
self.loop = None
197+
188198
async def restart(self):
189199
now = datetime.now()
190200
if (
@@ -209,7 +219,10 @@ async def handle_packet(self, packet):
209219
)
210220
except ValueError as e:
211221
log.debug(e)
212-
self.loop.create_task(self.restart())
222+
restart_task = self.loop.create_task(self.restart())
223+
224+
if hasattr(restart_task, "_log_destroy_pending"):
225+
restart_task._log_destroy_pending = False
213226
return
214227

215228
messages = (
@@ -271,7 +284,10 @@ async def handle_packet(self, packet):
271284
msg_id = msg.body.msg_id
272285
else:
273286
if self.client is not None:
274-
self.loop.create_task(self.client.handle_updates(msg.body))
287+
update_task = self.loop.create_task(self.client.handle_updates(msg.body))
288+
289+
if hasattr(update_task, "_log_destroy_pending"):
290+
update_task._log_destroy_pending = False
275291

276292
if msg_id in self.results:
277293
self.results[msg_id].value = getattr(msg.body, "result", msg.body)
@@ -305,7 +321,10 @@ async def ping_worker(self):
305321
), False
306322
)
307323
except OSError:
308-
self.loop.create_task(self.restart())
324+
restart_task = self.loop.create_task(self.restart())
325+
326+
if hasattr(restart_task, "_log_destroy_pending"):
327+
restart_task._log_destroy_pending = False
309328
break
310329
except RPCError:
311330
pass
@@ -334,11 +353,17 @@ async def recv_worker(self):
334353
)
335354

336355
if self.is_started.is_set():
337-
self.loop.create_task(self.restart())
356+
restart_task = self.loop.create_task(self.restart())
357+
358+
if hasattr(restart_task, "_log_destroy_pending"):
359+
restart_task._log_destroy_pending = False
338360

339361
break
340362

341-
self.loop.create_task(self.handle_packet(packet))
363+
packet_task = self.loop.create_task(self.handle_packet(packet))
364+
365+
if hasattr(packet_task, "_log_destroy_pending"):
366+
packet_task._log_destroy_pending = False
342367

343368
log.info("NetworkTask stopped")
344369

0 commit comments

Comments
 (0)