PythonÄÚ²¿µÄÏß³ÌʵÏÖ
ÔÚPythonÖеÄÏß³ÌÔËÐÐʵ¼ÊÊÇÊܵ½InterpreterµÄ¿ØÖÆ»òÕß˵ǣÖƵġ£ÔÚInterpreterµÄºËÐĺ¯Êý
PyObject * PyEval_EvalFrameEx
(PyFrameObject *f, int
throwflag)
ÎÒÃÇ¿ÉÒÔ¿´µ½ÓÐÒ»¸öÈ«¾Ö±äÁ¿_Py_TickerÀ´¿ØÖÆ×ÅÏ̶߳ÔInterpreterµÄÕ¼Óеģ¬Ä¬ÈÏÊÇInterpreterÿִÐÐÒ»°ÙÌõÖ¸Áî¾Í»áÊÍ·ÅÁíÒ»¸öÈ«¾Ö±äÁ¿interpreter_lock.
¶ÔÓÚÿ¸öÐÂỊ̈߳¬ËüÊÇÔõô¼ÓÈëµ½¶ÔInterpreterµÄ¾ºÕùÖÐÀ´µÄÄØ£¿Õâ¸öÎÊÌâÎÒÑо¿ÁËһϡ£ÆäÍ»Èëµã¾ÍÔÚµ±threadÄ£¿éÔÚʹÓÃthread_PyThread_start_new_threadÀ´´´½¨ºÍÆô¶¯ÐÂÏß³Ìʱ£¬ÐÂÏ̵߳ÄÆô¶¯º¯Êý¾ÍÊÇt_bootstrap,ÔÚt_bootstrapÖУ¬Ëû»áʹÓõ½Ò»¸öº¯Êý
void
PyEval_AcquireThread
(PyThreadState *tstate)
´Óµ÷ÓÃÕâ¸öº¯Êý¿ªÊ¼£¬ÐÂÔËÐеÄÏ߳̾ͿªÊ¼Á˽øÈëµ½Õù¶áinterpreterµÄÐÐÁÐÀïÀ´ÁË¡£
¶ÔÓ¦ÓëÕâ¸öº¯Êý»¹ÓÐÒ»¸ö
void
PyEval_ReleaseThread
(PyThreadState *tstate)
ºÜÇå³þ£¬Ò»¸öÊÇÓÃÀ´¶áËøµÄ£¬Ò»¸öÊÇÓÃÀ´·ÅËøµÄ¡£
´ËÍ⣬ÎÒÃÇÖªµÀÈç¹ûÔÚÒ»¸öÏß³ÌÖУ¬¶ÔÓ¦ÓëPythonµÄInterpreterµÄij¸öÖ¸Áîµ÷Ó㬱ÈÈçÊǺ¯Êýµ÷ÓÃÖ¸Á¶øÕâ¸öµ÷Óõĺ¯ÊýÓÐÊÇ»ùÓÚC module extensionÀ´ÊµÏֵģ¬¶øÔÚÕâ¸öº¯ÊýÖÐÈç¹ûÓÐIO»òÆäËüblockÐ͵IJÙ×÷µÄ»°£¬ÎÞÒÉÕâ¸öÏ̻߳ᱻblock£¬¶øÕâ¸öÏ̱߳»blockÈç¹ûûÓлúÖÆÔÚÈÃÆäËûÏß³ÌÔÚ´ËÏ̱߳»blockʱÇл»Ö´ÐеĻ°£¬ÄÇÕâ¸öInterpreterµÄperformance¹À¼Æ¾Í»á¸øÈËÂîËÀÁË£¬ËùÒÔÎÒÃÇ×Ðϸ¿´¿´£¬·¢ÏÖÆäʵÔÚpythonµÄCʵÏÖÊÇÌṩÁËÒ»¸ö»úÖÆÀ´Èñ»blockÏß³ÌÔÚblockÀà²Ù×÷֮ǰÀ´ÈóöInterpreterµÄ¡£
#define
Py_BEGIN_ALLOW_THREADS
#define
Py_END_ALLOW_THREADS
ÎÒÏÂÃæcopyÒ»¶ÎcodeÎļþÖеÄÔ»°£¬À´¿´¿´×÷ÕߵĽâÊÍ£º
/* Interface for threads.
A module that plans to do a blocking system call (or something else
that lasts a long time and doesn't touch Python data) can allow other
threads to run as follows:
...preparations here...
Py_BEGIN_ALLOW_THREADS
...blocking system call here...
Py_END_ALLOW_THREADS
...interpret result here...
The Py_BEGIN_ALLOW_THREADS/Py_END_ALLOW_THREADS pair expands to a
{}-surrounded block.
To leave the block in the middle (e.g., with return), you must insert
a line containing Py_BLOCK_THREADS before the return, e.g.
if (...premature_exit...) {
Py_BLOCK_THREADS
PyErr_Setf
Ïà¹ØÎĵµ£º
“¹þ¹þ£¡ÖªµÀÎÒ²Ù×÷Ö®ÍõС°×µÄÀ÷º¦ÁË°É£¡”
ÿµ±ÖÜÁùÍíÉÏ£¬Ð¡°××ÜÊÇÒª¸úËÞÉáµÄµÜÐÖÌô¼¸¾ÖħÊÞ¡£Æ¾½è×Å·çɧµÄ×ßλºÍâ«ËöµÄÒâʶ£¬Ð¡°××ÜÊÇЦµÀ×îºó¡£Õâ²»£¬Ð¡°×ÓÖÒ»´ÎÈ¡µÃÁËÒÔÒ»µÐ¶þµÄʤÀû¡£
“Ö÷ÒªÊǶàÏß²Ù×÷£¡”ÕâÊÇС°×¶Ô×Ô¼ºÊ¤ÀûµÄ×ܽ ......
def
subString
(s,
length):
us = unicode(s, 'utf-8
')
gs =
us.encode('gb2312
')
n = int(length)
t = gs[:n]
while True
:
try
:
&nb ......
¿ª·¢»·¾³£ºUbuntu9.10,python2.6,gcc4.4.11,ubuntuϵÄpythonÔËÐаüºÍ¿ª·¢°üÊÇ·Ö¿ªµÄ£¬Òò´ËÐèÒªÔÚÐÂÀûµÃÀïÃæ°²×°python-all-dev,´Ó¶ø¿ÉÒÔÔÚ´úÂëÖÐÒýÓÃpythonµÄÍ·ÎļþºÍ¿â¡£2.ÏÂÃæÊÇÒ»¸ö×î¼òµ¥µÄ¿ÉÒÔ¹©pythonµ÷ÓõÄcÀ©Õ¹Ä£¿é£¬¼ÙÉèc³ÌÐòÎļþÃûΪfoo.c:´úÂë#include <Python.h>
static PyObject* foo_b ......
myDict = { 'item1' : [ 7, 1, 9], 'item2' : [8, 2, 3], 'item3' : [ 9, 3, 11 ] }
def sortDic(Dict,valuePostion):
return sorted(Dict.items(),key=lambda e:e[1][valuePostion])
//°´valueµÄµÚ3¸öÖµÅÅÐò
sortDic(myDict,2)
[('item2', [8, 2, 3]), ('item1', [7, 1, 9]), ('item3', [9, 3, 11])]
//°´valueµÄµÚ ......