Skip to content
Projeler
Gruplar
Parçacıklar
Yardım
Yükleniyor...
Oturum aç / Kaydol
Gezinmeyi değiştir
C
cpython
Proje
Proje
Ayrıntılar
Etkinlik
Cycle Analytics
Depo (repository)
Depo (repository)
Dosyalar
Kayıtlar (commit)
Dallar (branch)
Etiketler
Katkıda bulunanlar
Grafik
Karşılaştır
Grafikler
Konular (issue)
0
Konular (issue)
0
Liste
Pano
Etiketler
Kilometre Taşları
Birleştirme (merge) Talepleri
0
Birleştirme (merge) Talepleri
0
CI / CD
CI / CD
İş akışları (pipeline)
İşler
Zamanlamalar
Grafikler
Paketler
Paketler
Wiki
Wiki
Parçacıklar
Parçacıklar
Üyeler
Üyeler
Collapse sidebar
Close sidebar
Etkinlik
Grafik
Grafikler
Yeni bir konu (issue) oluştur
İşler
Kayıtlar (commit)
Konu (issue) Panoları
Kenar çubuğunu aç
Batuhan Osman TASKAYA
cpython
Commits
fe133aad
Unverified
Kaydet (Commit)
fe133aad
authored
Ock 24, 2018
tarafından
Andrew Svetlov
Kaydeden (comit)
GitHub
Ock 24, 2018
Dosyalara gözat
Seçenekler
Dosyalara Gözat
İndir
Eposta Yamaları
Sade Fark
bpo-32391: Implement StreamWriter.wait_closed() (#5281)
üst
04af5b1b
Hide whitespace changes
Inline
Side-by-side
Showing
4 changed files
with
73 additions
and
10 deletions
+73
-10
asyncio-stream.rst
Doc/library/asyncio-stream.rst
+15
-0
streams.py
Lib/asyncio/streams.py
+27
-9
test_streams.py
Lib/test/test_asyncio/test_streams.py
+30
-1
2018-01-24-15-20-12.bpo-32391.0f8MY9.rst
...S.d/next/Library/2018-01-24-15-20-12.bpo-32391.0f8MY9.rst
+1
-0
No files found.
Doc/library/asyncio-stream.rst
Dosyayı görüntüle @
fe133aad
...
@@ -201,6 +201,21 @@ StreamWriter
...
@@ -201,6 +201,21 @@ StreamWriter
Close the transport: see :meth:`BaseTransport.close`.
Close the transport: see :meth:`BaseTransport.close`.
.. method:: is_closing()
Return ``True`` if the writer is closing or is closed.
.. versionadded:: 3.7
.. coroutinemethod:: wait_closed()
Wait until the writer is closed.
Should be called after :meth:`close` to wait until the underlying
connection (and the associated transport/protocol pair) is closed.
.. versionadded:: 3.7
.. coroutinemethod:: drain()
.. coroutinemethod:: drain()
Let the write buffer of the underlying transport a chance to be flushed.
Let the write buffer of the underlying transport a chance to be flushed.
...
...
Lib/asyncio/streams.py
Dosyayı görüntüle @
fe133aad
...
@@ -224,6 +224,7 @@ class StreamReaderProtocol(FlowControlMixin, protocols.Protocol):
...
@@ -224,6 +224,7 @@ class StreamReaderProtocol(FlowControlMixin, protocols.Protocol):
self
.
_stream_writer
=
None
self
.
_stream_writer
=
None
self
.
_client_connected_cb
=
client_connected_cb
self
.
_client_connected_cb
=
client_connected_cb
self
.
_over_ssl
=
False
self
.
_over_ssl
=
False
self
.
_closed
=
self
.
_loop
.
create_future
()
def
connection_made
(
self
,
transport
):
def
connection_made
(
self
,
transport
):
self
.
_stream_reader
.
set_transport
(
transport
)
self
.
_stream_reader
.
set_transport
(
transport
)
...
@@ -243,6 +244,11 @@ class StreamReaderProtocol(FlowControlMixin, protocols.Protocol):
...
@@ -243,6 +244,11 @@ class StreamReaderProtocol(FlowControlMixin, protocols.Protocol):
self
.
_stream_reader
.
feed_eof
()
self
.
_stream_reader
.
feed_eof
()
else
:
else
:
self
.
_stream_reader
.
set_exception
(
exc
)
self
.
_stream_reader
.
set_exception
(
exc
)
if
not
self
.
_closed
.
done
():
if
exc
is
None
:
self
.
_closed
.
set_result
(
None
)
else
:
self
.
_closed
.
set_exception
(
exc
)
super
()
.
connection_lost
(
exc
)
super
()
.
connection_lost
(
exc
)
self
.
_stream_reader
=
None
self
.
_stream_reader
=
None
self
.
_stream_writer
=
None
self
.
_stream_writer
=
None
...
@@ -259,6 +265,13 @@ class StreamReaderProtocol(FlowControlMixin, protocols.Protocol):
...
@@ -259,6 +265,13 @@ class StreamReaderProtocol(FlowControlMixin, protocols.Protocol):
return
False
return
False
return
True
return
True
def
__del__
(
self
):
# Prevent reports about unhandled exceptions.
# Better than self._closed._log_traceback = False hack
closed
=
self
.
_closed
if
closed
.
done
()
and
not
closed
.
cancelled
():
closed
.
exception
()
class
StreamWriter
:
class
StreamWriter
:
"""Wraps a Transport.
"""Wraps a Transport.
...
@@ -303,6 +316,12 @@ class StreamWriter:
...
@@ -303,6 +316,12 @@ class StreamWriter:
def
close
(
self
):
def
close
(
self
):
return
self
.
_transport
.
close
()
return
self
.
_transport
.
close
()
def
is_closing
(
self
):
return
self
.
_transport
.
is_closing
()
async
def
wait_closed
(
self
):
await
self
.
_protocol
.
_closed
def
get_extra_info
(
self
,
name
,
default
=
None
):
def
get_extra_info
(
self
,
name
,
default
=
None
):
return
self
.
_transport
.
get_extra_info
(
name
,
default
)
return
self
.
_transport
.
get_extra_info
(
name
,
default
)
...
@@ -318,15 +337,14 @@ class StreamWriter:
...
@@ -318,15 +337,14 @@ class StreamWriter:
exc
=
self
.
_reader
.
exception
()
exc
=
self
.
_reader
.
exception
()
if
exc
is
not
None
:
if
exc
is
not
None
:
raise
exc
raise
exc
if
self
.
_transport
is
not
None
:
if
self
.
_transport
.
is_closing
():
if
self
.
_transport
.
is_closing
():
# Yield to the event loop so connection_lost() may be
# Yield to the event loop so connection_lost() may be
# called. Without this, _drain_helper() would return
# called. Without this, _drain_helper() would return
# immediately, and code that calls
# immediately, and code that calls
# write(...); await drain()
# write(...); await drain()
# in a loop would never call connection_lost(), so it
# in a loop would never call connection_lost(), so it
# would not see an error when the socket is closed.
# would not see an error when the socket is closed.
await
sleep
(
0
,
loop
=
self
.
_loop
)
await
sleep
(
0
,
loop
=
self
.
_loop
)
await
self
.
_protocol
.
_drain_helper
()
await
self
.
_protocol
.
_drain_helper
()
...
...
Lib/test/test_asyncio/test_streams.py
Dosyayı görüntüle @
fe133aad
...
@@ -19,7 +19,7 @@ import asyncio
...
@@ -19,7 +19,7 @@ import asyncio
from
test.test_asyncio
import
utils
as
test_utils
from
test.test_asyncio
import
utils
as
test_utils
class
Stream
Reader
Tests
(
test_utils
.
TestCase
):
class
StreamTests
(
test_utils
.
TestCase
):
DATA
=
b
'line1
\n
line2
\n
line3
\n
'
DATA
=
b
'line1
\n
line2
\n
line3
\n
'
...
@@ -860,6 +860,35 @@ os.close(fd)
...
@@ -860,6 +860,35 @@ os.close(fd)
self
.
assertEqual
(
str
(
e
),
str
(
e2
))
self
.
assertEqual
(
str
(
e
),
str
(
e2
))
self
.
assertEqual
(
e
.
consumed
,
e2
.
consumed
)
self
.
assertEqual
(
e
.
consumed
,
e2
.
consumed
)
def
test_wait_closed_on_close
(
self
):
with
test_utils
.
run_test_server
()
as
httpd
:
rd
,
wr
=
self
.
loop
.
run_until_complete
(
asyncio
.
open_connection
(
*
httpd
.
address
,
loop
=
self
.
loop
))
wr
.
write
(
b
'GET / HTTP/1.0
\r\n\r\n
'
)
f
=
rd
.
readline
()
data
=
self
.
loop
.
run_until_complete
(
f
)
self
.
assertEqual
(
data
,
b
'HTTP/1.0 200 OK
\r\n
'
)
f
=
rd
.
read
()
data
=
self
.
loop
.
run_until_complete
(
f
)
self
.
assertTrue
(
data
.
endswith
(
b
'
\r\n\r\n
Test message'
))
self
.
assertFalse
(
wr
.
is_closing
())
wr
.
close
()
self
.
assertTrue
(
wr
.
is_closing
())
self
.
loop
.
run_until_complete
(
wr
.
wait_closed
())
def
test_wait_closed_on_close_with_unread_data
(
self
):
with
test_utils
.
run_test_server
()
as
httpd
:
rd
,
wr
=
self
.
loop
.
run_until_complete
(
asyncio
.
open_connection
(
*
httpd
.
address
,
loop
=
self
.
loop
))
wr
.
write
(
b
'GET / HTTP/1.0
\r\n\r\n
'
)
f
=
rd
.
readline
()
data
=
self
.
loop
.
run_until_complete
(
f
)
self
.
assertEqual
(
data
,
b
'HTTP/1.0 200 OK
\r\n
'
)
wr
.
close
()
self
.
loop
.
run_until_complete
(
wr
.
wait_closed
())
if
__name__
==
'__main__'
:
if
__name__
==
'__main__'
:
unittest
.
main
()
unittest
.
main
()
Misc/NEWS.d/next/Library/2018-01-24-15-20-12.bpo-32391.0f8MY9.rst
0 → 100644
Dosyayı görüntüle @
fe133aad
Implement :meth:`asyncio.StreamWriter.wait_closed` and :meth:`asyncio.StreamWriter.is_closing` methods
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment