تبدیل تاریخ ها در پایتون

دوستان عزیز این هم تایع تبدیل تاریخ شمسی به میلادی و برعکس و همچنین کنترل کننده ی تاریخ شمسی
این سورس رو خودم نوشته بودم و تقریبا دو سالی هست ازشون استفاده میکنم

import date_utils.calendar_util
def mil_to_sh_with_time(mildate):
    #dd = datetime.strptime(mildate)
 
 
 
    m = date_utils.calendar_util.jd_to_persian(
        date_utils.calendar_util.gregorian_to_jd(
           int(mildate.split("/")[0].split("-")[0]),
           int(mildate.split("/")[0].split("-")[1]),
           int(mildate.split("/")[0].split("-")[2])
            ))
    dt=m[0].__str__()+"/"+m[1].__str__()+"/"+m[2].__str__()+" "+mildate.split(" ")[1]
    return dt
 
 
def mil_to_sh(mildate,splitter="-"):
 
    #dd = datetime.strptime(mildate)
    #print mildate.split(" ")[0]
    mildate = mildate.__str__()
 
    if mildate==None:
     return ""
 
    m = date_utils.calendar_util.jd_to_persian(
        date_utils.calendar_util.gregorian_to_jd(
           int(mildate.split(" ")[0].split(splitter)[0]),
           int(mildate.split(" ")[0].split(splitter)[1]),
           int(mildate.split(" ")[0].split(splitter)[2])
            ))
    dt=m[0].__str__()+"/"+m[1].__str__()+"/"+m[2].__str__()
    return dt
 
 
 
def is_valid_shamsi_date(ShamsiDate):
    try:
    #dd = datetime.strptime(mildate)
        y=int(ShamsiDate.split("/")[0])
        m=int(ShamsiDate.split("/")[1])
        d=int(ShamsiDate.split("/")[2])
        if y > 1800: return False
        if m>12: return False
        if d>31: return False
 
        m = date_utils.calendar_util.jd_to_gregorian(
            date_utils.calendar_util.persian_to_jd(y, m, d))
        dt=m[0].__str__()+"/"+m[1].__str__()+"/"+m[2].__str__()
        return True
    except Exception as inst:
        return False
 
 
 
def sh_to_mil(mildate):
    #dd = datetime.strptime(mildate)
    m = date_utils.calendar_util.jd_to_gregorian(
        date_utils.calendar_util.persian_to_jd(
           int(mildate.split("/")[0]),
           int(mildate.split("/")[1]),
           int(mildate.split("/")[2])
            ))
    dt=m[0].__str__()+"/"+m[1].__str__()+"/"+m[2].__str__()
    return dt

دانلود کلاس مورد نیاز : date_utils

Thread in Python

سلام
تعدادی سوال برام پیام زده بودن دوستان درباره ی Thread در پایتون :
تو این پست یحث مقدماتی رو اشاره میکنم و سپس همیجوری تو زمانایی که برام آزاد بشه جلو تر میرم :
البته این بحث رو بنده از سایت پایتون براتون مینویسم

کار با Thread در پایتون مثل بیشتر زبان های برنامه نویسی هست ولی از اونها ساده تر !!!
· Threadهای متفاوت در یک پروسس در فضای Thread اصلی (منظور تردی هستکه مربوط به کد های اجرایی شما ) اجرا میشوند ، این امر موجب به اشتراک گذاری بهتر و ارتباط بهتر Thread ها در پایتون میشود
· Threadها بعضی مواقع فرایندهای سبک وزن نامیده میشوند به این علت که فرایندهای سربار حافظه نیستند و نیاز به حافظه زیاد ندارند و همچنین در فرایندهای حجیم برای ما به صرفه تر هستند
یک ترد ( منظورم همون Thread هست << البته چی توز هم میشه ها ،،،،،، تررررد !! ) در پایتون و صد البته در بیشتر زبان ها ترد ها یک شروع ، فرایند اجرا و نتیجه را همراه خود دارند، برای اینکه بفهمیم این ترد در چه فرایندی ( اجرا ، شروع یا پایان ) هست پایتون Tracker های جالبی دارهدر زیر اصلی ترین و مقدماتی ترین کد اجرایی پایتون رو مشاهده میکنید

thread.start_new_thread ( function, args[, kwargs] )

در مثال زیر نحوه استفاده از دستور اجرایی ترد را ببینید :مثال :

#!/usr/bin/python</span>
import thread</span>
import time</span>
 
# Define a function for the thread
def print_time( threadName, delay):
   count = 0
   while count < 5:
      time.sleep(delay)
      count += 1
      print "%s: %s" % ( threadName, time.ctime(time.time()) )
 
# Create two threads as follows
try:
   thread.start_new_thread( print_time, ("Thread-1", 2, ) )
   thread.start_new_thread( print_time, ("Thread-2", 4, ) )
except:
   print "Error: unable to start thread"
 
while 1:
   pass

و خروجی

Thread-1: Thu Jan 22 15:42:17 2009
 

 
Thread-1: Thu Jan 22 15:42:19 2009
 

 
Thread-2: Thu Jan 22 15:42:19 2009
 

 
Thread-1: Thu Jan 22 15:42:21 2009
 

 
Thread-2: Thu Jan 22 15:42:23 2009
 

 
Thread-1: Thu Jan 22 15:42:23 2009
 

 
Thread-1: Thu Jan 22 15:42:25 2009
 

 
Thread-2: Thu Jan 22 15:42:27 2009
 

 
Thread-2: Thu Jan 22 15:42:31 2009
 

 
Thread-2: Thu Jan 22 15:42:35 2009
 

همونطور که قبلا اشاره کردم پایتون زبونی ساده برای کار با تردهاست اما در نظر گرفتن نکاتی بسیار ضروریست ، لابلای این نکات به معماری تردها در پایتون نیز اشاره خواهد شد:
مهمترین مسئله ی استفاده کنندگان از ترد در پایتون ، مسئله ی Global Interpreter Lock ( به ترجمه ی بنده محدودیت کلی مترجم ( این بحث مترجم و کمپایلر در پایتون کلی بحث داره که خوبه بعدا بهش پرداخته بشه ) ) است. این مسئله فقط مجوز دسترسی یک ترد به مترجم را فراهم میکند. این مسئله به دو نکته در خود دارد : 1- معمولا به ندرت نیاز به استفاده از دستورات مربوط به محدودیت اشاره شده در ( Global Interpreter lock ) پایتون میباشد ( این مسئله نیاز به روشن شدن بیشتر دارد که در ادامه توضیح داده خواهد شد ) 2- جهت استفاده از مزایای استفاده از سیستم های چندپردازشی شما میبایست روندهای جداگانه استفاده کنید.برنامه نویس ابتدا میبایست هدف خود را در استفاده از ترد مشخص نماید. آیا هدف برنامه نویس استفاده از مزایای معماری چند هسته ای میباشد ؟ که در این صورت میبایست روندهای نرم افزار در قالبت چند روندی یا Multi Process طراحی و پیاده سازی شود. در استفاده از مزایای چند هسته ای ، روندها در پردازش های مختلف به هسته های اولویت بندی شده بوسیله ماشین مجازی پایتون و سپس بوسیله ی سیستم عامل محاسبه شده و نتیجه از همین مسیر به نرم افزار بر میگردد.
در ادامه به شرح طراحی ترد در پایتون میپردازم :

CPython ( اشاره مختصر و سریع )
جهت ادامه ی بحث مدیریت ترد ها لازم است یک سری از بسته های پایتون رو معرفی نمود.
سی پایتون از پایتون در محیط سی برگرفته شده است. این کاره ها ( برنامه نویس ها 😉 ) به جهت جدا سازی این بسته از پایتون آنرا سی پایتون میخوانند. سی پایتون رخدادیست که کد کدهای شما رو بصورت کد بایت های C به اجرا می آورد. این کدها به کدبایت های سی درآورده شده و آنها را در چرخه ی نظارتی خود ترجمه میکند. پس CPython یک مترجم کدبایتی است و در نتیجه سی پایتون را میتوان بعنوان یک مترجمی معرفی نمود که مکانیزم نوشتن به زبان پایتون و کمپایل به زبون سی معرفی کرد. (به این مقوله ( نوشتن به زبانی و کمپایل به زبونی دیگر ) Foreign Function interface نیز گفته میشود. )
حالا پس از خواندن پاراگرف بالا به بسته های زیر نیز توجه بشه بد نیست :
Jython نیز کد ها را در بایت کد های جاوایی کمپایل میکند و بشما اجازه میدهد کدهای خود را در JVM نیز به اجرا درآورید
IronPython نیز بشما اجازه میدهد کدهای خود را در Microsoft CLR اجرا نمایید.
و PyPy محیطی را فراهم میکند تا کدهای شما سریعتر از سی پاتون با همان ساختار سی پایتون اجرا شوند.
پس فهمیدیم که پایتون بسته هایی دارد که بشما اجازه میدهد کد های خود را تحت زبان های مختلف کمپایل و اجرا نمایید.

GIL یا همون Global Interpreter Lock
در سی پایتون ، GIL یک mutex است که بر تردهای مختلف اجرا کننده ی کدبایت های پایتون محدودیت هایی را اعمال می کند.
(موتکس : موتکس به ابزارهایی جهت اطمینان از اینکه هیچ دو پردازشی یا دو تردی در Critical Section بصورت همزمان اجرا نخواهند شد گفته میشود. Critical Section نیز به زمانی گفته میشود که یک روند در حال استفاده یا بررسی منابع اشتراکی میباشد ( منابع اشتراکی مثل حافظه ی به اشتراک گذاشته شده Shared Memory))
MUTEX >> wiki

Mutual_exclusion_example_with_linked_list

این محدودیت اعمال شده جزو ضرویات پایه ای سی پایتون است چون سیستم مدیریت حافظه سی پایتون thread-safe نیست و روندها رو بصورت تک پردازشی انجام میشود. پس نتیجه میگیریم مترجم پایتون یه مترجم چندپردازشی نیست ، و برای پشتیبانی از پردازش های multithread از محیط همه جانبه ای بنام GIL که در ابتدای کار میبایست بوسیله ی ترد اصلی پایتون ایجاد شده تا امکان دسترسی به آبکت های پایتون را فراهم آورد استفاده میکند.
بدون دخالت GIL حتی ساده ترین روند ها نیز میتواند در مولتی تردینگ مسئله ساز شود.

GIL : 
GIL معمولا بحث برانگیز است ، به این علت که این سیستم مولتی تردهای سی پایتون را از مزایای مولتی پراسس منع می کند. ( بطور بلقوه روندهای طولانی مانند مدیریت های خروجی و ورودی یا Image Processing خارج از GIL کار میشوند. بنا بر این در برنامه های مولتی تردینگی CPython که پروسس های طولانی مدت دارند GIL را به تگنا می رسانند.
سوال : پس GIL برای مولتی تردینگ در سیستم های مولتی کور چه راهکاری دارد ؟؟ GIL رفتاری جالب و منحصربفردی در این حوزه دارد که نظر توسعه دهندگان را بخود جلب میکند J
بیایید باهم ببینیم :
این تابع به درد نخور را در نظر بگیرید :

def count(n):
   while n > 0:
      n -= 1

حالا این تابع را دوبار پیاپی اجرا نمایید :

count(100000000)
count(100000000)

و حالا این دو را در دو ترد بصورت پارالل اجرا کنید :
فول سورس :

from Queue import Queue
from threading import Thread
import datetime
def count(n):
    print datetime.datetime.time(datetime.datetime.now())
    while n > 0:
        n -= 1
    print datetime.datetime.time(datetime.datetime.now())
count(100000)
count(100000)
print "--------------"
print "In Thread"
t1 = Thread(target=count,args=(100000,))
t1.run()
t2 = Thread(target=count,args=(100000,))
t2.run()

و اما خروجی

11:11:41.662000
11:11:41.662000
11:11:41.834000
--------------
In Thread
11:11:41.834000
11:11:42.024000
11:11:42.024000
11:11:42.213000

و در آخر نتیجه :
آخر چرا در یک سیستم 4 کور با 8 گیگ رم ترد ها با سرعت تقریبی 1.5x آهسته تر اجرا شدند ؟؟
اگه حالا برنامه رو با یک کور اجرا کنم چه اتفاقی می افتد ؟؟ بللله !!! 1.3x آهسته تر !!
حالا کمی روی این موضوع فکر کنیم J
.
.
.
.
.
. ( مثلا در حال فکر کردن هستیم ) !! @
.
.
.
.
.
.
و اما رفتار GIL
· این مسئله ساده هست : ترد ها GIL را در حین اجرا از آن خود میکنند

Untitled3

· در بالا مدلی از مولتی تردینگ که بصورت هماهنگ کار میکنند نمایش داده شده است

نحوه ی تنظیم آپاچی برای اجرای دیجانگو

نیازمندی ها :
1- Python 2.7
2- Xampp
3- سیستم عامل ویندوز ، هر ورژنی

پیش فرض ها :
اینگونه در نظر میگیریم که دو برنامه ی بالا نصب شده و کار میکنند
1- ابتدا Django را از نصب میکنیم
2- سعی کنید همیشه به پیشنهاد خود دیجانگو مبنی بر استفاده از آخرین ورژن رسمی استفاده کنید ، ( همکنون 1.6.5 )
3- از آدرس روبر دانلود رو شروع می کنیم : https://pypi.python.org/pypi/Django/1.6.5 …
4- بعد از دانلود پکیج رو از حالت فشرده خارج و نصب رو شروع کنید

cmd.exe
cd Django-1.6.5
python setup.py install

1-4- بعد از نصب به آدرس زیر مراجعه میکنیم و دیگر نیازی به پوشه دانلود شده نداریم و می توانیم آنرا حذف کنیم
1-5- توجه داشته باشید با cmd وارد پوشه ی مدیریت پکیج های پایتون رفته و اقدام به ایجاد یک سایت نماییم ، به شرح زیر

cmd.exe
 
cd C:\Python27\Lib\site-packages\django\bin
python django-admin.py startproject mysite
 
همکنون صاحب یک سایت شدید و نوبت به ساخت یک اپلیکیشن میره
 
cd mysite
 
python manage.py startapp MyApp1

5- همکنون دیجانگو نصب شد و یک سایت نیز آماده شد
6- می رویم سراغ آپاچی
7- در ابتدای کار باید کتابخانه mod_wsgi.so را در آپاچی نصب کنیم – برای اینکار میبایست به این آدرس مراجعه نمایید
8- اگر آپاچی 32بیتی دارید پیشنهاد میکنم پکیج mod_wsgi‑3.5.ap24.win32‑py2.7.zip را استفاده نمایید ولی در صورتی که در مراحل بعدی دچار عدم استارت آپاچی شدید می تونید سایر بیست پیکیج ارائه شده در سایت رو امتحان کنید و ببینید کدومش با آپاچی اجرا میشه
9- بعد از دانلود و unzip فایل mod_wsgi-3.5.ap22.win-amd64-py2.7.so را به mod_wsgi.so تغییر نام دهید
10- وارد پوشه xampp شوید و سپس وارد پوشه apache و سپس وارد پوشه modules و فایل اغییرنام یافته را در آنجا کپی نمایید
11- حالا یه back بزنید و وارد پوشه conf شوید
12- و سپس فایل httpd.conf رو باز کرده و متن های زیر را وارد نمایید

LoadModule wsgi_module modules/mod_wsgi.so
WSGIPythonHome C:/Python27/
WSGIPythonPath C:/Python27/python.exe
WSGIScriptAlias / "C:/xampp/htdocs/mysite/mod.wsgi"
Alias /ms "C:/xampp/htdocs/mysite"

13- در بالا ما به آپاچی می فهمانیم که ماژول دانلود شده را لود کرده و سپس پوشه پایتون و همچنین فایل اجرایی پایتون را در مخش داشته باشد و سپس اسکریپت اصلی سایتی که با دیجانگو ساختیم رو بهش معرفی نموده و سپس یک Alias که کار رو راحتتر میکنه بهش معرفی میکنیم
14- حالا از قسمت مدیریت پکیج های پایتون و همونجایی که سایتمون ساخته شده بود پوشه رو کات می کنیم تو داکیومنت های آپاجی یعنی

cut C:\Python27\Lib\site-packages\django\bin\mysite
paste C:\xampp\htdocs

15- در مسیر که پیست کردیم وارد شده و یک فایل به نام mod.wsgi می سازمیم یعنی :

D:\xampp\htdocs\mysite\mod.wsgi

16- فایل مورد نظر را باز کرده و محتوای زیر را وارد نماییم :

import os, sys
 
 
path = 'D:/xampp/htdocs/mysite'
if path not in sys.path:
    sys.path.append(path)
 
 
 
os.environ['DJANGO_SETTINGS_MODULE'] = 'mysite.settings'
 
import django.core.handlers.wsgi
application = django.core.handlers.wsgi.WSGIHandler()

17- سپس سرویس آپاجی رو یک بار ریست میکنیم
18- معمولا به ندرت پیش میاد همه چی خوب کار کنه و سرویس با خوبی لود بشه ولی اگه مشکلی بود حتما بگید پیگیری می کنیم باهم
19- بعد از شروع سرویس وارد browser شده و بنویسید :

rahsoon.com/ms

20- و سپس سایتتون با دیجانگو به راحتی بالا میاد

مشکلی بود اعلام بفرمایید