2012-09-20 81 views
1

當服務器正在進行像前端索引這樣的長時間運行操作時,如何以編程方式通知它是否被鎖定?我目前的代碼是這樣的:如何判斷服務器是否被鎖定?

def server_locked(timeout=5): 
    con = pymongo.Connection(network_timeout=5) 
    try: 
     con.database_names() 
     return False 
    except pymongo.errors.AutoReconnect: 
     return True 

但是有沒有更好的方法?

+0

設定一些evnironmental變量和使用它像一個信號......? –

回答

1

在數據庫中,使用current_op()查看正在進行的操作。 和command('serverStatus')獲取每個鎖的報告。

下面是一個例子,在做了很多刀片:

connection = Connection() 
db = connection.test_database 
db.current_op() 

{ 
    u'inprog': [ 
    { 
     u'numYields': 0, 
     u'lockStats': { 
     u'timeAcquiringMicros': { 
      u'r': 0L, 
      u'w': 3L 
     }, 
     u'timeLockedMicros': { 

     } 
     }, 
     u'waitingForLock': False, 
     u'desc': u'conn1', 
     u'connectionId': 1, 
     u'locks': { 
     u'^test': u'W', 
     u'^': u'w' 
     }, 
     u'client': u'127.0.0.1:64743', 
     u'threadId': u'0x104681000', 
     u'active': True, 
     u'query': { 

     }, 
     u'opid': 11199, 
     u'ns': u'test.test', 
     u'secs_running': 0, 
     u'op': u'insert' 
    } 
    ] 
} 
+0

那麼,我該如何得到我想要的呢?迭代'inprog'並檢查'locks'字段? – georg

+0

我相信如此。我沒有測試過這部分。請記住,在2.2中有一個數據庫鎖,而在以前的版本中有一個全局服務器鎖。看到這個[博客文章](http://blog.serverdensity.com/goodbye-global-lock-mongodb-2-0-vs-2-2/) –

0

Pymongo Connection對象有一個名爲is_locked屬性。

Documentation

+0

'is_locked'只返回'fsyncLock'狀態,I' m也對讀鎖有興趣。 – georg

相關問題