Python: Difference between revisions
From Tech
Jump to navigationJump to search
Content deleted Content added
No edit summary |
No edit summary |
||
| (4 intermediate revisions by 2 users not shown) | |||
| Line 1: | Line 1: | ||
* [[multiprocess.Lock replacement using SYSV]] |
|||
<nowiki> |
|||
* [[Converting Gregorian dates to day numbers]] |
|||
import ctypes |
|||
* [[numpy surprises]]] |
|||
import os |
|||
import sys |
|||
IPC_CREAT=00001000 |
|||
# man shm_overview |
|||
# for f in `find /lib/lib* -type f `; do nm -D $f|grep sem_open && echo found in library: $f; done |
|||
locksUsed=0 |
|||
class Lock: |
|||
def __init__(self): |
|||
#http://www.dailyfreecode.com/code/create-shared-memory-print-id-shared-2183.aspx |
|||
global locksUsed |
|||
self.fname="/tmp/Py-Lock%4i"%locksUsed |
|||
self.libc = ctypes.cdll.LoadLibrary("/lib/libc.so.6") |
|||
self.librt = ctypes.cdll.LoadLibrary("/lib/librt.so.1") |
|||
f=open(self.fname,"w") |
|||
f.write("0") |
|||
f.close() |
|||
self.key=self.libc.ftok(fname, 0x55) |
|||
print "ftok returned:", self.key |
|||
r=self.libc.semget(self.key, 1, IPC_CREAT|0666) |
|||
print "semget returned: ",r |
|||
si=self.librt.sem_init(self.mem, 1, 1) |
|||
print "sem_init returned:", si |
|||
locksUsed+=1 |
|||
def acquire(self): |
|||
self.librt.sem_wait(self.sm) |
|||
def release(self): |
|||
self.librt.sem_post(self.sm) |
|||
#class Lock_POSIX: |
|||
# def __init__(self): |
|||
# global locksUsed |
|||
# self.librt = ctypes.cdll.LoadLibrary("/lib/libpthread.so.0") |
|||
# |
|||
# try: |
|||
# self.librt.sem_unlink("/PyLock%4i"%locksUsed) |
|||
# except: |
|||
# pass |
|||
# self.sm=self.librt.sem_open("/PyLock%4i"%locksUsed, os.O_RDWR|os.O_CREAT, 0x1ff, 1) |
|||
# if sm==0: |
|||
# print "sem_open returned:", self.sm |
|||
# sys.exit() |
|||
# #si=self.librt.sem_init(self.sm, 1, 1) |
|||
# print "sem_init returned:", si |
|||
# if self.sm>=0: |
|||
# locksUsed+=1 |
|||
# |
|||
# def acquire(self): |
|||
# self.librt.sem_wait(self.sm) |
|||
# |
|||
# def release(self): |
|||
# self.librt.sem_post(self.sm) |
|||
if __name__== "__main__": |
|||
import time |
|||
import random |
|||
from multiprocessing import Process |
|||
l=Lock() |
|||
def fight(i): |
|||
for j in range(10): |
|||
l.acquire() |
|||
for k in range(10): |
|||
print i |
|||
time.sleep(random.random()/30.) |
|||
print |
|||
l.release() |
|||
Process(target=fight, args=(1,)).start() |
|||
Process(target=fight, args=(2,)).start() |
|||
Process(target=fight, args=(3,)).start() |
|||
Process(target=fight, args=(4,)).start() |
|||
</nowiki> |
|||
<nowiki> |
|||
#include <sys/types.h> |
|||
#include <sys/ipc.h> |
|||
#include <sys/sem.h> |
|||
#include <stdlib.h> |
|||
#include <stdio.h> |
|||
int acquire(int semid){ |
|||
struct sembuf sops[2]; |
|||
sops[0].sem_num = 0; |
|||
sops[0].sem_op = -1; |
|||
sops[0].sem_flg = SEM_UNDO; |
|||
if (semop(semid, sops, 1) == -1) { |
|||
perror("acquire"); |
|||
exit(1); |
|||
} |
|||
} |
|||
int release(int semid){ |
|||
struct sembuf sops[2]; |
|||
sops[0].sem_num = 0; /* Operate on semaphore 0 */ |
|||
sops[0].sem_op = 1; /* Wait for value to equal 0 */ |
|||
sops[0].sem_flg = SEM_UNDO; |
|||
if (semop(semid, sops, 1) == -1) { |
|||
perror("release"); |
|||
exit(1); |
|||
} |
|||
} |
|||
void p(int semid, int i){ |
|||
int j; |
|||
acquire(semid); |
|||
for(j=0; j<10; j++){ |
|||
printf("%i\n",i); |
|||
sleep(1); |
|||
} |
|||
release(semid); |
|||
} |
|||
int main(int argc, char **argv){ |
|||
key_t key; |
|||
int semid; |
|||
int wait_status; |
|||
key=ftok("l-.l", 0x55); |
|||
printf("key=%i\n",key); |
|||
semid=semget(key, 1, IPC_CREAT|0666); |
|||
printf("semid=%i\n",semid); |
|||
release(semid); |
|||
printf("after first release"); |
|||
printf("semid=%i\n", semid); |
|||
if(fork()){ |
|||
p(semid, 1); |
|||
wait(&wait_status); |
|||
} else { |
|||
p(semid, 2); |
|||
} |
|||
} |
|||
</nowiki> |
|||