2013-05-20 3 views
2

У меня есть приложение python, которое запускает отдельный процесс для выполнения некоторой работы (я столкнулся с проблемами производительности, используя потоки из-за GIL (глобальная блокировка интерпретатора)). Теперь, что мои методы в python для синхронизации общих ресурсов между процессами?Синхронизация между несколькими процессами в python

Я перемещаю данные в очередь, а процесс появления происходит, когда он получает данные из этой очереди. Но я должен быть в состоянии гарантировать, что данные будут поступать упорядоченным образом, в том же порядке, который был скопирован, поэтому я должен гарантировать, что только один процесс в любое время может читать/записывать из/в очередь. Как мне сделать это лучше всего?

Спасибо, Рон

+0

http://en.wikipedia.org/wiki/Semaphore_(programming)? – Noelkd

+0

Noelkd, thanks - Я нашел это: http://docs.python.org/release/2.4.2/lib/semaphore-examples.html это сделает? – cerr

+0

Правильно должно быть еще несколько современных документов. Можете написать быстрый пример, если меня никто не бьет! – Noelkd

ответ

1

Я думаю, что вам нужно Семафор, проверить этот пример кода:

import threading 
import datetime 


class ThreadClass(threading.Thread): 
    def run(self): 
     now = datetime.datetime.now() 
     pool.acquire() 
     print "%s says hello, World! at time: %s" % (self.getName(),now) 
     pool.release() 


pool = threading.BoundedSemaphore(value=1) 


for i in range(10): 
     t = ThreadClass() 
     t.start() 

Имеет этот вывод:

Thread-1 says hello, World! at time: 2013-05-20 18:57:47.609000 
Thread-2 says hello, World! at time: 2013-05-20 18:57:47.609000 
Thread-3 says hello, World! at time: 2013-05-20 18:57:47.609000 
Thread-4 says hello, World! at time: 2013-05-20 18:57:47.609000 
Thread-5 says hello, World! at time: 2013-05-20 18:57:47.609000 
Thread-6 says hello, World! at time: 2013-05-20 18:57:47.609000 
Thread-7 says hello, World! at time: 2013-05-20 18:57:47.609000 
Thread-8 says hello, World! at time: 2013-05-20 18:57:47.609000 
Thread-9 says hello, World! at time: 2013-05-20 18:57:47.609000 
Thread-10 says hello, World! at time: 2013-05-20 18:57:47.609000 

Где, как:

import threading 
import datetime 


class ThreadClass(threading.Thread): 
    def run(self): 
     now = datetime.datetime.now() 
     print "%s says hello, World! at time: %s" % (self.getName(),now) 




for i in range(10): 
     t = ThreadClass() 
     t.start() 

Имеет этот вывод:

Thread-1 says hello, World! at time: 2013-05-20 18:58:05.531000Thread-2 says hello, World! at time: 2013-05-20 18:58:05. 
531000 

Thread-4 says hello, World! at time: 2013-05-20 18:58:05.531000Thread-3 says hello, World! at time: 2013-05-20 18:58:05 
.531000 

Thread-6 says hello, World! at time: 2013-05-20 18:58:05.531000Thread-5 says hello, World! at time: 2013-05-20 18:58:05 
.531000 

Thread-8 says hello, World! at time: 2013-05-20 18:58:05.531000Thread-7 says hello, World! at time: 2013-05-20 18:58:05 
.531000 

Thread-10 says hello, World! at time: 2013-05-20 18:58:05.531000Thread-9 says hello, World! at time: 2013-05-20 18:58:0 
5.531000 

Так с BoundedSemaphore в Python вы можете убедиться, что, прежде чем кто-нибудь пишет в очередь они должны иметь семафор. Это не гарантирует, что ваши результаты будут добавлены в очередь в правильном порядке.

EDIT:

Если вы собираетесь это сделать, и сохранить порядок ваш будет нужно что-то вроде этого:

import multiprocessing 
import datetime 
import random 
import time 

def funfun(number): 
    time.sleep(random.randint(0,10)) 
    now = datetime.datetime.now() 
    return "%s says hello, World! at time: %s" % (number,now) 

if __name__ == "__main__": 
    pool = multiprocessing.Pool(10) 
    for item in pool.imap(funfun,[i for i in range(10)]): 
     print item 

, который печатает:

0 says hello, World! at time: 2013-05-21 00:38:48.546000 
1 says hello, World! at time: 2013-05-21 00:38:55.562000 
2 says hello, World! at time: 2013-05-21 00:38:47.562000 
3 says hello, World! at time: 2013-05-21 00:38:51.578000 
4 says hello, World! at time: 2013-05-21 00:38:50.578000 
5 says hello, World! at time: 2013-05-21 00:38:48.593000 
6 says hello, World! at time: 2013-05-21 00:38:52.593000 
7 says hello, World! at time: 2013-05-21 00:38:48.593000 
8 says hello, World! at time: 2013-05-21 00:38:50.593000 
9 says hello, World! at time: 2013-05-21 00:38:51.609000 

Так с этим можно просто присоединитесь к очереди в правильном порядке, и задания будут ждать очереди, чтобы добавить в очередь.

Смежные вопросы