2016-09-22 8 views
0

ハローが定義されていない、私はpythonを使用してPostgreSQLの私はPythonとマルチのモジュールを使用して、私はグローバル使用するときに、エラーが発生していること、グローバル名が

に分散データベースを比較したい、とmultiprocessingを使用して私は

プロンプト
ことを、グローバルランダム4を定義したときマルチロール

をシミュレートするために、私は4ランダムを作成し、その実行時間

を計算したいが、

グローバル名「」

が定義されていない、私はこの問題を解決する方法がわからない(すべてのループのために、ランダム4は、分散データベースとposgresqlで同じ値を持つ必要があります)

ここに私がいますコード

#coding=utf-8 
import psycopg2 
import random 
import multiprocessing 

conn = psycopg2.connect("dbname=test user=higis password=dbrgdbrg host=10.1.1.215 port=5432") 
cur = conn.cursor() 

#test-SQl operate 
def multitest(num): 
    global a 
    global b 
    global c 
    global d 
    a = random.randint(74,135) 
    b = random.randint(18,53) 
    c = random.randint(74,135) 
    d = random.randint(18,53) 
    if a>c: 
     a=c 
    if b>d: 
     b=d 
    try: 
     sqltest = "SELECT ogc_fid FROM testindex_1 WHERE ST_MAKEENVELOPE" + str((a,b,c,d,4326))+str("&& wkb_geometry") 
     cur.execute(sqltest) 
     #print cur.fetchall() 
    except Exception, e: 
     print e 


#citus-SQL operate 
def multicitus(num): 
    try: 
     sqlcitus = "SELECT ogc_fid FROM citusindex_1 WHERE ST_MAKEENVELOPE" + str((a, b, c, d, 4326)) + str(
      "&& wkb_geometry") 
     cur.execute(sqlcitus) 
     #print cur.fetchall() 

    except Exception,e: 
     print e 

#test-multi-process 
if __name__ =="__main__": 
    nums = 5 
    for num in range(nums): 
     p = multiprocessing.Process(target=multitest,args=(num,)) 
     #print 'process a %d is start'%num 
     p.start() 
     p.join() 


    #citus-multi-process 
    for num in range(nums): 
     q = multiprocessing.Process(target=multicitus,args=(num,)) 
     #print 'process b %d is start'%num 
     q.start() 
     q.join() 



cur.close() 
conn.close() 

答えて

1

エラーは、sqlcitusの文字列を作成している間、multicitus()からのものです。

multitest()で宣言されたグローバル変数a、b、c、dを取得したいと思います。しかし、問題はmulticitus()とsqlcitus()が異なるプロセスにあり、グローバル変数を共有することは不可能です。グローバル変数は、同じプロセスの異なる機能間で共有することができます。

この問題を解決する方法の1つは、Pipesを使用してmulticitus()とsqlcitus()の間でデータ(この例ではa、b、c、d)を転送することです。

#coding=utf-8 
import random 
import multiprocessing 
from multiprocessing import Process, Pipe 

#test-SQl operate 
def multitest(num, conn): 
    a = random.randint(74,135) 
    b = random.randint(18,53) 
    c = random.randint(74,135) 
    d = random.randint(18,53) 
    conn.send([a, b, c, d]) 
    if a>c: 
     a=c 
    if b>d: 
     b=d 
    try: 
     sqltest = "SELECT ogc_fid FROM testindex_1 WHERE ST_MAKEENVELOPE" + str((a,b,c,d,4326))+str("&& wkb_geometry") 
     print sqltest 
    except Exception, e: 
     print e 


#citus-SQL operate 
def multicitus(num, conn): 
    try: 
     a, b, c, d = conn.recv() 
     sqlcitus = "SELECT ogc_fid FROM citusindex_1 WHERE ST_MAKEENVELOPE" + str((a, b, c, d, 4326)) + str(
     "&& wkb_geometry") 
     print sqlcitus 
    except Exception, e: 
     print e 

#test-multi-process 
if __name__ =="__main__": 
    nums = 5 
    pips = [] 
    for i in range(nums): 
     pips.append(Pipe()) 

    # connect and running a database 
    for num in range(nums): 
     p = multiprocessing.Process(target=multitest,args=(num, pips[num][0])) 
     #print 'process a %d is start'%num 
     p.start() 
     p.join() 

    #citus-multi-process 
    for num in range(nums): 
     q = multiprocessing.Process(target=multicitus,args=(num, pips[num][1])) 
     #print 'process b %d is start'%num 
     q.start() 
     q.join() 
+0

キューとは異なりますか? – user82538

関連する問題