Difference between revisions of "Python"
From Tech
Jump to navigationJump to search(3 intermediate revisions by one other user not shown) | |||
Line 1: | Line 1: | ||
+ | * [[multiprocess.Lock replacement using SYSV]] |
||
− | <nowiki> |
||
+ | * [[Converting Gregorian dates to day numbers]] |
||
− | import ctypes |
||
− | 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> |