Обсуждение: connection file descriptors created with identical number after process fork on mac

Поиск
Список
Период
Сортировка

connection file descriptors created with identical number after process fork on mac

От
Chris Withers
Дата:
Hi All,

I'm writing some multi-process code in Python and trying to make sure I
open a new connection for each process. Here's the really cut down code:

"""
import os, time
import psycopg2
from multiprocessing import Pool


def init():
     conn = psycopg2.connect("dbname=...host=localhost")
     print os.getpid(), ' child fd:', conn.fileno()

if __name__=='__main__':
     pool = Pool(initializer=init)
     time.sleep(30)
"""

What's really surpising to me is the output on a mac:

$ python psycopg2_multiprocess.py
44276  child fd: 13
44277  child fd: 13
44278  child fd: 13
44279  child fd: 13

The getpid() output indicates that the connec() call is being made
inside a different process each time, yet the connection appears to
still be using the same fd.

conn.file() is basically (long int)PQsocket(self->pgconn);:
https://github.com/psycopg/psycopg2/blob/master/psycopg/connection_type.c#L898

Is there something I'm missing about file descriptors on Macs or is
something bad happening here?

Chris


Re: connection file descriptors created with identical number after process fork on mac

От
Tom Lane
Дата:
Chris Withers <chris@simplistix.co.uk> writes:
> I'm writing some multi-process code in Python and trying to make sure I
> open a new connection for each process. Here's the really cut down code:
> ...
> What's really surpising to me is the output on a mac:

> $ python psycopg2_multiprocess.py
> 44276  child fd: 13
> 44277  child fd: 13
> 44278  child fd: 13
> 44279  child fd: 13

> The getpid() output indicates that the connec() call is being made
> inside a different process each time, yet the connection appears to
> still be using the same fd.

FD numbers are process-local in all flavors of Unix.  The above only
proves that all of these processes had FDs 0..12 open already, which
doesn't seem terribly surprising.

            regards, tom lane


Re: connection file descriptors created with identical number after process fork on mac

От
Chris Withers
Дата:
On 04/08/2016 00:20, Tom Lane wrote:
> Chris Withers <chris@simplistix.co.uk> writes:
>> I'm writing some multi-process code in Python and trying to make sure I
>> open a new connection for each process. Here's the really cut down code:
>> ...
>> What's really surpising to me is the output on a mac:
>
>> $ python psycopg2_multiprocess.py
>> 44276  child fd: 13
>> 44277  child fd: 13
>> 44278  child fd: 13
>> 44279  child fd: 13
>
>> The getpid() output indicates that the connec() call is being made
>> inside a different process each time, yet the connection appears to
>> still be using the same fd.
>
> FD numbers are process-local in all flavors of Unix.  The above only
> proves that all of these processes had FDs 0..12 open already, which
> doesn't seem terribly surprising.

Thanks, that's certainly good news!

How can I convince myself, from the client side, that I really have got
a new connection and not somehow ended up with one that been passed on
as part of the fork?

cheers,

Chris


Re: connection file descriptors created with identical number after process fork on mac

От
John R Pierce
Дата:
On 8/3/2016 4:25 PM, Chris Withers wrote:
>
> How can I convince myself, from the client side, that I really have
> got a new connection and not somehow ended up with one that been
> passed on as part of the fork?

$ psql -tc "select pg_backend_pid();"
           18635

$ psql -tc "select pg_backend_pid();"
           18665

$ psql -tc "select pg_backend_pid();"
           18727


now, operating system process ID's do get recycled eventually but not
very fast.

--
john r pierce, recycling bits in santa cruz