Embarassingly Actualización de DB paralela usando Python (PostGIS / PostgreSQL)

Necesito actualizar cada registro en una base de datos espacial en la que tengo un conjunto de datos de puntos que superponen un conjunto de datos de polígonos. Para cada entidad de puntos, quiero asignar una clave para relacionarla con la entidad de polígono en la que se encuentra. Entonces, si mi punto 'New York City' se encuentra dentro del polígono USA y para el polígono USA 'GID = 1', asignaré 'gid_fkey = 1' para mi punto New York City.

Para hacer esto, he creado la siguiente consulta.

procQuery = 'UPDATE city SET gid_fkey = gid FROM country  WHERE ST_within((SELECT the_geom FROM city WHERE wp_id = %s), country.the_geom) AND city_id = %s' % (cityID, cityID)

Actualmente, obtengo la información de cityID de otra consulta que solo selecciona todos los cityID donde gid_fkey es NULL. Esencialmente solo necesito recorrerlos y ejecutar la consulta mostrada anteriormente. Como la consulta solo se basa en información estática en la otra tabla, en teoría, todos estos procesos pueden ejecutarse a la vez. He implementado el procedimiento de subprocesamiento a continuación, pero parece que no puedo hacer la migración a multiprocesamiento

import psycopg2, pprint, threading, time, Queue

queue = Queue.Queue()
pyConn = psycopg2.connect("dbname='geobase_1' host='localhost'")
pyConn.set_isolation_level(0)
pyCursor1 = pyConn.cursor()

getGID = 'SELECT cityID FROM city'
pyCursor1.execute(getGID)
gidList = pyCursor1.fetchall()

class threadClass(threading.Thread):

def __init__(self, queue):
        threading.Thread.__init__(self)
        self.queue = queue

def run(self):

        while True:
            gid = self.queue.get()

            procQuery = 'UPDATE city SET gid_fkey = gid FROM country  WHERE ST_within((SELECT the_geom FROM city WHERE wp_id = %s), country.the_geom) AND city_id = %s' % (cityID, cityID)

            pyCursor2 = pyConn.cursor()                         
            pyCursor2.execute(procQuery)

            print gid[0]                    
            print 'Done'

def main():

    for i in range(4):
        t = threadClass(queue)
        t.setDaemon(True)
        t.start()

        for gid in gidList:
            queue.put(gid)

    queue.join()

main()

Ni siquiera estoy seguro de si el subprocesamiento múltiple es óptimo, pero definitivamente es más rápido que pasar uno por uno.

La máquina que usaré tiene cuatro núcleos (Quad Core) y un sistema operativo Linux mínimo sin GUI, PostgreSQL, PostGIS y Python si eso hace la diferencia.

Qué necesito cambiar para habilitar esta tarea de multiprocesamiento dolorosamente fácil?

Respuestas a la pregunta(2)

Su respuesta a la pregunta