C # имеет встроенный lock
, и вы можете использовать его, создав статический объект, для которого все потоки имеют доступ к:
private static object lockObject {get;set;}
public static object LockObject {get{return lockObject ?? lockObject = new object();}}
void YourMethod()
{
lock(LockObject) // all other threads will wait for y
{
using(var lockFileStream = File.Open("Lock.txt", FileMode.Open, FileAccess.Read, FileShare.None))
{
//Do what you need with the file.
}
}
}
Это создает подход Thread Thread для вашей проблемы.
Вы можете написать высокоспециализированный кодировщик и крючок декодера:
import json
class MultiDimensionalArrayEncoder(json.JSONEncoder):
def encode(self, obj):
def hint_tuples(item):
if isinstance(item, tuple):
return {'__tuple__': True, 'items': item}
if isinstance(item, list):
return [hint_tuples(e) for e in item]
if isinstance(item, dict):
return {key: hint_tuples(value) for key, value in item.items()}
else:
return item
return super(MultiDimensionalArrayEncoder, self).encode(hint_tuples(obj))
def hinted_tuple_hook(obj):
if '__tuple__' in obj:
return tuple(obj['items'])
else:
return obj
enc = MultiDimensionalArrayEncoder()
jsonstring = enc.encode([1, 2, (3, 4), [5, 6, (7, 8)]])
print jsonstring
# [1, 2, {"items": [3, 4], "__tuple__": true}, [5, 6, {"items": [7, 8], "__tuple__": true}]]
print json.loads(jsonstring, object_hook=hinted_tuple_hook)
# [1, 2, (3, 4), [5, 6, (7, 8)]]
Это с помощью simplejson
import simplejson
def _to_json(python_object) :
if isinstance(python_object, tuple) :
python_object = {'__class__': 'tuple',
'__value__': list(python_object)}
else :
raise TypeError(repr(python_object) + ' is not JSON serializable')
return python_object
def _from_json(json_object):
if json_object['__class__'] == 'tuple':
return tuple(json_object['__value__'])
return json_object
jsn = simplejson.dumps((1,2,3),
default=_to_json,
tuple_as_array=False)
tpl = simplejson.loads(jsn, object_hook=_from_json)
Принципиальная разница между списками python и кортежами является изменчивостью, которая не имеет отношения к представлениям JSON, если вы не планируете изменять внутренние члены списка JSON, а в текстовой форме. Просто переверните списки, которые вы вернетесь в кортежи. Если вы не используете какие-либо пользовательские декодеры объектов, единственными структурированными типами данных, которые вы должны учитывать, являются объекты JSON и массивы, которые выходят как питоны и списки.
def tuplify(listything):
if isinstance(listything, list): return tuple(map(tuplify, listything))
if isinstance(listything, dict): return {k:tuplify(v) for k,v in listything.items()}
return listything
Если вы специализируетесь на декодировании , или хотите, чтобы некоторые массивы JSON были списками python, а другие - кортежами python, вам нужно будет обернуть элементы данных в dict или кортеж, который аннотирует информацию о типе. Это само по себе является лучшим способом повлиять на поток управления алгоритмом, чем на ветвление, основанное на том, что ли это список или кортеж (или какой-либо другой повторяемый тип).
encode
должна быть такжеdict
ветвь. – georg 30 March 2013 в 21:08object_hook
s. – mrKelley 31 March 2013 в 16:56return {'__tuple__': True, 'items': item}
наreturn {'__tuple__': True, 'items': tuple(hint_tuples(e) for e in item)}
, может быть? – user189 15 October 2015 в 14:19