mirror of https://github.com/python/cpython
merge heads
This commit is contained in:
commit
64c1c07201
|
@ -123,7 +123,9 @@ and off individually. They are described here in more detail.
|
||||||
.. 2to3fixer:: callable
|
.. 2to3fixer:: callable
|
||||||
|
|
||||||
Converts ``callable(x)`` to ``isinstance(x, collections.Callable)``, adding
|
Converts ``callable(x)`` to ``isinstance(x, collections.Callable)``, adding
|
||||||
an import to :mod:`collections` if needed.
|
an import to :mod:`collections` if needed. Note ``callable(x)`` has returned
|
||||||
|
in Python 3.2, so if you do not intend to support Python 3.1, you can disable
|
||||||
|
this fixer.
|
||||||
|
|
||||||
.. 2to3fixer:: dict
|
.. 2to3fixer:: dict
|
||||||
|
|
||||||
|
|
|
@ -348,7 +348,7 @@ This is the server side::
|
||||||
def handle(self):
|
def handle(self):
|
||||||
# self.request is the TCP socket connected to the client
|
# self.request is the TCP socket connected to the client
|
||||||
self.data = self.request.recv(1024).strip()
|
self.data = self.request.recv(1024).strip()
|
||||||
print("%s wrote:" % self.client_address[0])
|
print("{} wrote:".format(self.client_address[0]))
|
||||||
print(self.data)
|
print(self.data)
|
||||||
# just send back the same data, but upper-cased
|
# just send back the same data, but upper-cased
|
||||||
self.request.send(self.data.upper())
|
self.request.send(self.data.upper())
|
||||||
|
@ -372,7 +372,7 @@ objects that simplify communication by providing the standard file interface)::
|
||||||
# self.rfile is a file-like object created by the handler;
|
# self.rfile is a file-like object created by the handler;
|
||||||
# we can now use e.g. readline() instead of raw recv() calls
|
# we can now use e.g. readline() instead of raw recv() calls
|
||||||
self.data = self.rfile.readline().strip()
|
self.data = self.rfile.readline().strip()
|
||||||
print("%s wrote:" % self.client_address[0])
|
print("{} wrote:".format(self.client_address[0]))
|
||||||
print(self.data)
|
print(self.data)
|
||||||
# Likewise, self.wfile is a file-like object used to write back
|
# Likewise, self.wfile is a file-like object used to write back
|
||||||
# to the client
|
# to the client
|
||||||
|
@ -395,16 +395,18 @@ This is the client side::
|
||||||
# Create a socket (SOCK_STREAM means a TCP socket)
|
# Create a socket (SOCK_STREAM means a TCP socket)
|
||||||
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
|
|
||||||
# Connect to server and send data
|
try:
|
||||||
sock.connect((HOST, PORT))
|
# Connect to server and send data
|
||||||
sock.send(bytes(data + "\n","utf8"))
|
sock.connect((HOST, PORT))
|
||||||
|
sock.send(bytes(data + "\n", "utf-8"))
|
||||||
|
|
||||||
# Receive data from the server and shut down
|
# Receive data from the server and shut down
|
||||||
received = sock.recv(1024)
|
received = str(sock.recv(1024), "utf-8")
|
||||||
sock.close()
|
finally:
|
||||||
|
sock.close()
|
||||||
|
|
||||||
print("Sent: %s" % data)
|
print("Sent: {}".format(data))
|
||||||
print("Received: %s" % received)
|
print("Received: {}".format(received))
|
||||||
|
|
||||||
|
|
||||||
The output of the example should look something like this:
|
The output of the example should look something like this:
|
||||||
|
@ -421,10 +423,10 @@ Client::
|
||||||
|
|
||||||
$ python TCPClient.py hello world with TCP
|
$ python TCPClient.py hello world with TCP
|
||||||
Sent: hello world with TCP
|
Sent: hello world with TCP
|
||||||
Received: b'HELLO WORLD WITH TCP'
|
Received: HELLO WORLD WITH TCP
|
||||||
$ python TCPClient.py python is nice
|
$ python TCPClient.py python is nice
|
||||||
Sent: python is nice
|
Sent: python is nice
|
||||||
Received: b'PYTHON IS NICE'
|
Received: PYTHON IS NICE
|
||||||
|
|
||||||
|
|
||||||
:class:`socketserver.UDPServer` Example
|
:class:`socketserver.UDPServer` Example
|
||||||
|
@ -445,7 +447,7 @@ This is the server side::
|
||||||
def handle(self):
|
def handle(self):
|
||||||
data = self.request[0].strip()
|
data = self.request[0].strip()
|
||||||
socket = self.request[1]
|
socket = self.request[1]
|
||||||
print("%s wrote:" % self.client_address[0])
|
print("{} wrote:".format(self.client_address[0]))
|
||||||
print(data)
|
print(data)
|
||||||
socket.sendto(data.upper(), self.client_address)
|
socket.sendto(data.upper(), self.client_address)
|
||||||
|
|
||||||
|
@ -467,11 +469,11 @@ This is the client side::
|
||||||
|
|
||||||
# As you can see, there is no connect() call; UDP has no connections.
|
# As you can see, there is no connect() call; UDP has no connections.
|
||||||
# Instead, data is directly sent to the recipient via sendto().
|
# Instead, data is directly sent to the recipient via sendto().
|
||||||
sock.sendto(bytes(data + "\n","utf8"), (HOST, PORT))
|
sock.sendto(bytes(data + "\n", "utf-8"), (HOST, PORT))
|
||||||
received = sock.recv(1024)
|
received = str(sock.recv(1024), "utf-8")
|
||||||
|
|
||||||
print("Sent: %s" % data)
|
print("Sent: {}".format(data))
|
||||||
print("Received: %s" % received)
|
print("Received: {}".format(received))
|
||||||
|
|
||||||
The output of the example should look exactly like for the TCP server example.
|
The output of the example should look exactly like for the TCP server example.
|
||||||
|
|
||||||
|
@ -491,9 +493,9 @@ An example for the :class:`ThreadingMixIn` class::
|
||||||
class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):
|
class ThreadedTCPRequestHandler(socketserver.BaseRequestHandler):
|
||||||
|
|
||||||
def handle(self):
|
def handle(self):
|
||||||
data = self.request.recv(1024)
|
data = str(self.request.recv(1024), 'ascii')
|
||||||
cur_thread = threading.current_thread()
|
cur_thread = threading.current_thread()
|
||||||
response = bytes("%s: %s" % (cur_thread.getName(), data),'ascii')
|
response = bytes("{}: {}".format(cur_thread.name, data), 'ascii')
|
||||||
self.request.send(response)
|
self.request.send(response)
|
||||||
|
|
||||||
class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
|
class ThreadedTCPServer(socketserver.ThreadingMixIn, socketserver.TCPServer):
|
||||||
|
@ -502,10 +504,12 @@ An example for the :class:`ThreadingMixIn` class::
|
||||||
def client(ip, port, message):
|
def client(ip, port, message):
|
||||||
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
|
||||||
sock.connect((ip, port))
|
sock.connect((ip, port))
|
||||||
sock.send(message)
|
try:
|
||||||
response = sock.recv(1024)
|
sock.send(bytes(message, 'ascii'))
|
||||||
print("Received: %s" % response)
|
response = str(sock.recv(1024), 'ascii')
|
||||||
sock.close()
|
print("Received: {}".format(response))
|
||||||
|
finally:
|
||||||
|
sock.close()
|
||||||
|
|
||||||
if __name__ == "__main__":
|
if __name__ == "__main__":
|
||||||
# Port 0 means to select an arbitrary unused port
|
# Port 0 means to select an arbitrary unused port
|
||||||
|
@ -518,13 +522,13 @@ An example for the :class:`ThreadingMixIn` class::
|
||||||
# more thread for each request
|
# more thread for each request
|
||||||
server_thread = threading.Thread(target=server.serve_forever)
|
server_thread = threading.Thread(target=server.serve_forever)
|
||||||
# Exit the server thread when the main thread terminates
|
# Exit the server thread when the main thread terminates
|
||||||
server_thread.setDaemon(True)
|
server_thread.daemon = True
|
||||||
server_thread.start()
|
server_thread.start()
|
||||||
print("Server loop running in thread:", server_thread.name)
|
print("Server loop running in thread:", server_thread.name)
|
||||||
|
|
||||||
client(ip, port, b"Hello World 1")
|
client(ip, port, "Hello World 1")
|
||||||
client(ip, port, b"Hello World 2")
|
client(ip, port, "Hello World 2")
|
||||||
client(ip, port, b"Hello World 3")
|
client(ip, port, "Hello World 3")
|
||||||
|
|
||||||
server.shutdown()
|
server.shutdown()
|
||||||
|
|
||||||
|
@ -533,9 +537,9 @@ The output of the example should look something like this::
|
||||||
|
|
||||||
$ python ThreadedTCPServer.py
|
$ python ThreadedTCPServer.py
|
||||||
Server loop running in thread: Thread-1
|
Server loop running in thread: Thread-1
|
||||||
Received: b"Thread-2: b'Hello World 1'"
|
Received: Thread-2: Hello World 1
|
||||||
Received: b"Thread-3: b'Hello World 2'"
|
Received: Thread-3: Hello World 2
|
||||||
Received: b"Thread-4: b'Hello World 3'"
|
Received: Thread-4: Hello World 3
|
||||||
|
|
||||||
|
|
||||||
The :class:`ForkingMixIn` class is used in the same way, except that the server
|
The :class:`ForkingMixIn` class is used in the same way, except that the server
|
||||||
|
|
|
@ -321,7 +321,11 @@ class Pool(object):
|
||||||
|
|
||||||
@staticmethod
|
@staticmethod
|
||||||
def _handle_workers(pool):
|
def _handle_workers(pool):
|
||||||
while pool._worker_handler._state == RUN and pool._state == RUN:
|
thread = threading.current_thread()
|
||||||
|
|
||||||
|
# Keep maintaining workers until the cache gets drained, unless the pool
|
||||||
|
# is terminated.
|
||||||
|
while thread._state == RUN or (pool._cache and thread._state != TERMINATE):
|
||||||
pool._maintain_pool()
|
pool._maintain_pool()
|
||||||
time.sleep(0.1)
|
time.sleep(0.1)
|
||||||
# send sentinel to stop workers
|
# send sentinel to stop workers
|
||||||
|
|
|
@ -1217,6 +1217,20 @@ class _TestPoolWorkerLifetime(BaseTestCase):
|
||||||
p.close()
|
p.close()
|
||||||
p.join()
|
p.join()
|
||||||
|
|
||||||
|
def test_pool_worker_lifetime_early_close(self):
|
||||||
|
# Issue #10332: closing a pool whose workers have limited lifetimes
|
||||||
|
# before all the tasks completed would make join() hang.
|
||||||
|
p = multiprocessing.Pool(3, maxtasksperchild=1)
|
||||||
|
results = []
|
||||||
|
for i in range(6):
|
||||||
|
results.append(p.apply_async(sqr, (i, 0.3)))
|
||||||
|
p.close()
|
||||||
|
p.join()
|
||||||
|
# check the results
|
||||||
|
for (j, res) in enumerate(results):
|
||||||
|
self.assertEqual(res.get(), sqr(j))
|
||||||
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Test that manager has expected number of shared objects left
|
# Test that manager has expected number of shared objects left
|
||||||
#
|
#
|
||||||
|
|
11
Misc/NEWS
11
Misc/NEWS
|
@ -61,6 +61,11 @@ Core and Builtins
|
||||||
Library
|
Library
|
||||||
-------
|
-------
|
||||||
|
|
||||||
|
- Issue #10332: multiprocessing: fix a race condition when a Pool is closed
|
||||||
|
before all tasks have completed.
|
||||||
|
|
||||||
|
- Issue #13255: wrong docstrings in array module.
|
||||||
|
|
||||||
- Issue #9168: now smtpd is able to bind privileged port.
|
- Issue #9168: now smtpd is able to bind privileged port.
|
||||||
|
|
||||||
- Issue #12529: fix cgi.parse_header issue on strings with double-quotes and
|
- Issue #12529: fix cgi.parse_header issue on strings with double-quotes and
|
||||||
|
@ -193,6 +198,12 @@ Extension Modules
|
||||||
- Issue #12950: Fix passing file descriptors in multiprocessing, under
|
- Issue #12950: Fix passing file descriptors in multiprocessing, under
|
||||||
OpenIndiana/Illumos.
|
OpenIndiana/Illumos.
|
||||||
|
|
||||||
|
Documentation
|
||||||
|
-------------
|
||||||
|
|
||||||
|
- Issue #13141: Demonstrate recommended style for socketserver examples.
|
||||||
|
|
||||||
|
|
||||||
What's New in Python 3.2.2?
|
What's New in Python 3.2.2?
|
||||||
===========================
|
===========================
|
||||||
|
|
||||||
|
|
|
@ -1484,7 +1484,7 @@ PyDoc_STRVAR(fromunicode_doc,
|
||||||
\n\
|
\n\
|
||||||
Extends this array with data from the unicode string ustr.\n\
|
Extends this array with data from the unicode string ustr.\n\
|
||||||
The array must be a unicode type array; otherwise a ValueError\n\
|
The array must be a unicode type array; otherwise a ValueError\n\
|
||||||
is raised. Use array.frombytes(ustr.decode(...)) to\n\
|
is raised. Use array.frombytes(ustr.encode(...)) to\n\
|
||||||
append Unicode data to an array of some other type.");
|
append Unicode data to an array of some other type.");
|
||||||
|
|
||||||
|
|
||||||
|
@ -1506,7 +1506,7 @@ PyDoc_STRVAR(tounicode_doc,
|
||||||
\n\
|
\n\
|
||||||
Convert the array to a unicode string. The array must be\n\
|
Convert the array to a unicode string. The array must be\n\
|
||||||
a unicode type array; otherwise a ValueError is raised. Use\n\
|
a unicode type array; otherwise a ValueError is raised. Use\n\
|
||||||
array.tostring().decode() to obtain a unicode string from\n\
|
array.tobytes().decode() to obtain a unicode string from\n\
|
||||||
an array of some other type.");
|
an array of some other type.");
|
||||||
|
|
||||||
|
|
||||||
|
@ -2557,7 +2557,7 @@ count() -- return number of occurrences of an object\n\
|
||||||
extend() -- extend array by appending multiple elements from an iterable\n\
|
extend() -- extend array by appending multiple elements from an iterable\n\
|
||||||
fromfile() -- read items from a file object\n\
|
fromfile() -- read items from a file object\n\
|
||||||
fromlist() -- append items from the list\n\
|
fromlist() -- append items from the list\n\
|
||||||
fromstring() -- append items from the string\n\
|
frombytes() -- append items from the string\n\
|
||||||
index() -- return index of first occurrence of an object\n\
|
index() -- return index of first occurrence of an object\n\
|
||||||
insert() -- insert a new item into the array at a provided position\n\
|
insert() -- insert a new item into the array at a provided position\n\
|
||||||
pop() -- remove and return item (default last)\n\
|
pop() -- remove and return item (default last)\n\
|
||||||
|
@ -2565,7 +2565,7 @@ remove() -- remove first occurrence of an object\n\
|
||||||
reverse() -- reverse the order of the items in the array\n\
|
reverse() -- reverse the order of the items in the array\n\
|
||||||
tofile() -- write all items to a file object\n\
|
tofile() -- write all items to a file object\n\
|
||||||
tolist() -- return the array converted to an ordinary list\n\
|
tolist() -- return the array converted to an ordinary list\n\
|
||||||
tostring() -- return the array converted to a string\n\
|
tobytes() -- return the array converted to a string\n\
|
||||||
\n\
|
\n\
|
||||||
Attributes:\n\
|
Attributes:\n\
|
||||||
\n\
|
\n\
|
||||||
|
|
Loading…
Reference in New Issue